数据结构实验7:查找的应用

目录

一、实验目的

二、实验原理

1. 顺序查找

2. 折半查找

3. 二叉树查找 

三、实验内容

实验一

任务

 代码

截图

实验2

任务

代码

截图


一、实验目的

1.掌握查找的基本概念;

2.掌握并实现以下查找算法:顺序查找、折半查找、二叉树查找。

二、实验原理

1. 顺序查找

原理:

顺序查找是一种逐个检查数据元素的搜索方法。从列表的第一个元素开始,逐个比较目标值和列表中的元素,直到找到匹配的元素或搜索完整个列表。

时间复杂度:

O(n),其中n是数据元素的数量。 

代码:

int sequential_search(int arr[], int size, int target) {for (int i = 0; i < size; i++) {if (arr[i] == target) {//若找到目标元素,返回第一个出现的索引return i;}}return -1;//若没有找到目标元素
}

2. 折半查找

原理:

折半查找要求数据元素必须有序。它通过反复将搜索范围减半来查找目标值。首先,与中间元素比较,如果目标值小于中间元素,则在左半部分继续查找;如果大于中间元素,则在右半部分继续查找。重复这个过程直到找到目标值或搜索范围缩小到空。 

时间复杂度:

 O(log n),其中n是数据元素的数量。

代码:

int binary_search(int arr[], int size, int target) {int low = 0, high = size - 1;while (low <= high) {int mid = (low + high) / 2;if (arr[mid] == target) {//若找到目标元素,返回出现的索引return mid;}else if (target < arr[mid]) {//如果中间元素较大high = mid - 1;}else {//如果中间元素较小low = mid + 1;}}return -1;//若没有找到目标元素
}

3. 二叉树查找 

原理:

二叉树是一种树形结构,每个节点最多有两个子节点,且左子节点的值小于父节点,右子节点的值大于父节点。二叉树查找利用这个有序性质,通过比较目标值和当前节点的值,决定向左子树或右子树移动,直到找到目标值或达到叶子节点。

时间复杂度:

平均情况下为O(log n),最坏情况下可能为O(n),取决于树的平衡性。

代码:

//定义二叉树结构
struct Treenode {int value;struct Treenode* left;struct Treenode* right;
};//创建新结点
struct Treenode* Create_node(int num) {struct Treenode* node = (struct Treenode*)malloc(sizeof(struct Treenode));node->value = num;node->left = NULL;node->right = NULL;return node;
}
//二叉树查找
struct Treenode* binary_tree_search(struct Treenode* root,int target) {if (root->value == target) {//如果找到return root;}else if(root->value<target){//如果目标值小于根,则在其左子树上查找return binary_tree_search(root->left, target);}else {//如果目标值大于根,则在其右子树上查找return binary_tree_search(root->right, target);}
}

三、实验内容

对同一组数据,试用三种方法查找某一相同数据:

1.建立一个顺序表,用顺序查找的方法对其实施查找;

2.建立一个有序表,用折半查找的方法对其实施查找;

3.建立一个二叉排序树,根据给定值对其实施查找;

实验一

任务

包括的函数有: typedef struct,创建函数 void create(seqlist &L),输出函数 voidprint(seqlist L),顺序查找 int find(seqlist L,intnumber),折半查找 int halffind(seqlist L,int number),主函数 main()。

 代码

#include<iostream>
using namespace std;//定义学生结构
typedef struct Record {int ID;//学号string name;//姓名string sex;//性别int age;//年龄
}student;typedef struct seqlist {student record[10];//这个列表最多有十个学生的记录int num;//实际学生的数目
};//对列表进行初始化
void Initial_list(seqlist& list) {list.num = 0;return;
}//创建列表
void create(seqlist& L) {cout << "请输入学生数目:";cin >> L.num;cout << "学号  姓名  性别  年龄" << endl;for (int i = 0; i < L.num; i++) {cin >> L.record[i].ID;cin >> L.record[i].name;cin >> L.record[i].sex;cin >> L.record[i].age;}return;
}//打印列表
void print(seqlist L) {cout << "学生的基本信息为:" << endl;cout << "学号  姓名  性别  年龄" << endl;for (int i = 0; i < L.num; i++) {cout << L.record[i].ID <<"  " <<L.record[i].name<<"  " << L.record[i].sex << "  "<<L.record[i].age << endl;}return;
}//顺序表查找
int find(seqlist L, int number) {for (int i = 0; i < L.num; i++) {if (L.record[i].ID == number) {//若找到目标元素,返回第一个出现的索引return i;}}return -1;//若目标不在顺序表中
}//折半查找
int halffind(seqlist L, int number) {int low = 0, high = L.num - 1;while (low <= high) {int mid = (low + high) / 2;if (L.record[mid].ID == number) {//若找到目标元素,返回出现的索引return mid;}else if (number < L.record[mid].ID) {//如果中间元素较大high = mid - 1;}else {//如果中间元素较小low = mid + 1;}}return -1;//若没有找到目标元素
}int main() {seqlist L1;int id1, id2,index1,index2;Initial_list(L1);//初始化create(L1);//输入,由于要求满足折半查找,则表中元素应该有序print(L1);//输出cout << "顺序查找" << endl;cout << "请输入你要查询的学号:";cin >> id1;index1 = find(L1, id1);if (index1 ==-1 ) {cout << "未找到所需元素" << endl;}else {cout << L1.record[index1].ID << "  " << L1.record[index1].name << "  " << L1.record[index1].sex << "  " << L1.record[index1].age << endl;}cout << "折半查找" << endl;cout << "请输入你要查询的学号:";cin >> id2;index2 = halffind(L1, id2);if (index2 == -1) {cout << "未找到所需元素" << endl;}else {cout << L1.record[index2].ID << "  " << L1.record[index2].name << "  " << L1.record[index2].sex << "  " << L1.record[index2].age << endl;}
}

截图

实验2

任务

 包括的函数有:结构体 typedef struct, 插入函数 void insert(bnode*& T,bnode * S), void insert1(bnode * & T) , 创 建 函 数 voidcreate(bnode*& T),查找函数:bnode *search (bnode*T. int number),主函数main()。

代码

#include <iostream>
#include <cstdlib>
using namespace std;// 定义二叉树结构
struct TreeNode {int ID;string name;string sex;int age;struct TreeNode* left;struct TreeNode* right;
};// 创建新结点
struct TreeNode* Create_node(int num) {struct TreeNode* newnode = new TreeNode;if (newnode == NULL) {cout << "内存分配失败" << endl;exit(1);  // 或者采取其他处理方式}newnode->ID = num;cout << "输入姓名、性别、年龄:" << endl;cin >> newnode->name;cin >> newnode->sex;cin >> newnode->age;newnode->left = NULL;newnode->right = NULL;return newnode;
}// 建立二叉树
struct TreeNode* buildTree() {int elem;cout << "输入节点的数值(-1代表空节点):";cin >> elem;if (elem == -1) {return NULL;}struct TreeNode* root = Create_node(elem);cout << "输入" << elem << "的左节点" << endl;root->left = buildTree();cout << "输入" << elem << "的右节点" << endl;root->right = buildTree();return root;
}// 二叉树查找
struct TreeNode* binary_tree_search(struct TreeNode* root, int target) {if (root == NULL || root->ID == target) {return root;}if (target < root->ID) {return binary_tree_search(root->left, target);}else {return binary_tree_search(root->right, target);}
}// 插入节点
void insert(struct TreeNode* root, int target) {if (root == NULL) {//若是空节点,直接插入root= Create_node(target);return;}if (target < root->ID) {//插入左子树if (root->left == NULL) {//左子树为空,直接插入root->left = Create_node(target);}else {insert(root->left, target);}}else {if (root->right == NULL) {root->right = Create_node(target);}else {insert(root->right, target);}}return;
}int main() {struct TreeNode* T = buildTree();  // 建立二叉树int number;cout << "请输入你要插入的学生的ID:";cin >> number;insert(T, 4);int targetID;cout << "输入要查找的学生ID:" << endl;cin >> targetID;struct TreeNode* ans = binary_tree_search(T, targetID);if (ans != NULL) {cout << ans->ID << " " << ans->name << " " << ans->sex << " " << ans->age << endl;}else {cout << "未找到目标节点" << endl;}return 0;
}

截图

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/638287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给github设置代理

1 引言 本文详细介绍了在 Linux 环境下配置和使用网络代理的步骤。包括使用环境变量设置代理的方法、在 Git 中配置代理的常用方法以及一些调试工具。这些内容对于需要在网络受限环境下使用 Git 的用户非常实用。 2 配置代理 export http_proxyhttp://host:port/ export h…

Python正则表达式Regular Expression初探

目录 Regular 匹配规则 单字符匹配 数量匹配 边界匹配 分组匹配 贪婪与懒惰 原版说明 特殊字符 转义序列 模块方法 函数说明 匹配模式 常用匹配规则 1. 匹配出所有整数 2. 匹配11位且13开头的整数 Regular Python的re模块提供了完整的正则表达式功能。正则表达式…

js算法不连续子序列

涉及力扣题目&#xff1a; 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 上一次我们说过如何求连续子序列&#xff0c;解决方法是模拟一个”棋盘“两两相同对撞&#xff0c;又因为是连续所以一定是对角线为上一组相同。这次有点变化&#xff0c;要求是非连续子序列。 …

前端上传图片至OSS

环境&#xff1a;VUE3NODEJS16 一、第一步肯定是引入依赖 在package.json文件中的dependencies加上"ali-oss": "^6.17.1"如下代码所示&#xff1a; //加入后的整体展示"dependencies": {"ali-oss": "^6.17.1"},然后在控制台…

【Delphi 基础知识 22】TStringList 的详细用法

文章目录 TStringList 与TStrings的区别TStringList 常用方法与属性 TStringList 类在Delphi中会经常使用到&#xff0c;我们这里一起来看看 TStringList 的详细用法. TStringList 与TStrings的区别 TStringList 和 TStrings 都是 Delphi 编程语言中用于处理字符串列表的类。它…

Win10升级Win11后卡顿了?

目录 关闭动画效果 任务栏居中改为居左 调整外观和性能 其他 当你看到最后&#xff0c;还知道哪些升级WIN11后必做的优化呢&#xff1f;欢迎在评论区分享出来&#xff01;❤️ win11上市目前也有一段时间了&#xff0c;想必很多大家都已经进行更新了。新的系统确实更加简洁…

安规电容的知识

1、常见安规电容有哪些&#xff1f; 一般我们所说的安规电容也就有两种&#xff0c;一种就是X安规电容&#xff08;X1/X2/X3安规电容&#xff09;&#xff0c;还有一种是Y电容&#xff08;最常见的是Y1和Y2安规电容&#xff09;。 2、x电容的位置 火线零线间的是X电容。x电容用…

Git将某个文件合并到指定分支

企业开发中&#xff0c;经常会单独拉分支去做自己的需求开发&#xff0c;但是某些时候一些公共的配置我们需要从主线pull&#xff0c;这时候整个分支merge显然不合适 1.切换至待合并文件的分支 git checkout <branch>2.将目标分支的单个文件合并到当前分支 git checkou…

力扣刷MySQL-第三弹(详细讲解)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

JVM中的垃圾收集算法

标记-清除算法 首先标记出所有需要回收的对象&#xff0c;在标记完成后&#xff0c;统一回收掉所有被标记的对象&#xff0c;也可以反过来&#xff0c;标记存活的对象&#xff0c;统一回收所有未被标记的对象。标记过程就是对象是否属于垃圾的判定过程 缺点 第一个是执行效率…

【算法基础 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理)

文章目录 为什么需要逆元逆元的概念1.单位元2.逆元3.模乘的单位元4.模乘的逆元 开始求逆元1.扩展欧几里得定理2.费马小定理 原文链接 为什么需要逆元 首先&#xff0c;在算法竞赛中&#xff0c;很多情况下会遇到数值很大的数据&#xff0c;这个时候&#xff0c;题目往往会让我…

C# 获取QQ会话聊天信息

目录 利用UIAutomation获取QQ会话聊天信息 效果 代码 目前遇到一个问题 其他解决办法 利用UIAutomation获取QQ会话聊天信息 效果 代码 AutomationElement window AutomationElement.FromHandle(get.WindowHwnd); AutomationElement QQMsgList window.FindFirst(Tr…

4.postman批量运行及json、cvs文件运行

一、批量运行collection 1.各个接口设置信息已保存&#xff0c;在collection中点击run collection 2.编辑并运行集合 集合运行时&#xff0c;单独上传图片时报错。需修改postman设置 二、csv文件运行 可新建记事本&#xff0c;输入测试数据&#xff0c;后另存为新的文本文件&…

Pytest 结合 Allure 生成测试报告

测试报告在项目中是至关重要的角色&#xff0c;一个好的测试报告&#xff1a; 可以体现测试人员的工作量&#xff1b; 开发人员可以从测试报告中了解缺陷的情况&#xff1b; 测试经理可以从测试报告中看到测试人员的执行情况及测试用例的覆盖率&#xff1b; 项目负责人可以通过…

c#之函数

1. 定义一个函数,用来取得数字的和,但是数字的个数不确定 (1) class Program{static int Sum(int[] array){int num 0;for (int i 0; i < array.Length; i){num num array[i];}return num;}static void Main(string[] args){int sum Sum(new int[]{12,13,34,5,68,9,9…

echarts-wordcloud词云

echarts-wordcloud是基于echarts的一个插件&#xff0c;所以我们要首先安装echarts包&#xff0c;然后再安装echarts-wordcloud的包&#xff0c;这里我的练习项目安装的版本&#xff1b;当然&#xff0c;你可以随意安装你需要的版本&#xff1b; “echarts”: “^5.3.3”, “ec…

Hive架构设计

我们知道MapReduce和Spark它们提供了高度抽象的编程接口便于用户编写分布式程序,它们具有极好的扩展性和容错性,能够处理超大规模的数据集。这些计算引擎提供了面向高级语言(比如Java,Python等)的编程接口,然而,考虑到分布式程序编写的复杂性,直接使用这些编程接口实现…

Django中解决跨域问题

同源策略&#xff08;Same origin policy&#xff09;是一种约定&#xff0c;它规定了 请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同&#xff0c;如果不一致&#xff0c;请求会发送成功&#xff0c;后端会正常响应&#xff0c;但是浏览器会拦截 …

面试2024.1.20

简单介绍下你做的项目。 这个神领物流项目是一个前后端分离的项目&#xff0c;前段他有3个客户端&#xff08;用户端为微信小程序、司机端和快递员端为app&#xff09;一个管理端&#xff08;pc&#xff09;&#xff0c;后端用的技术栈用的是SpringAlibabaCloud、数据库用的是M…

【精选】中间件 tomcat漏洞复现

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…