验证实验-折半查找
折半查找程序实验报告
1. 理解折半查找(也称为二分查找)的原理和步骤。
2. 掌握在计算机程序中实现折半查找的方法。
3. 通过实验加深对折半查找算法的理解,并提高编程能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验原理折半查找是一种在有序数组中查找特定元素的算法。
其基本思想是将查找区间分为两半,然后判断目标值位于哪一半区间内,再对那一半区间进行同样的操作,直到找到目标值或查找区间为空。
折半查找的步骤如下:1. 初始化两个指针,low指向数组的第一个元素,high指向数组的最后一个元素。
2. 计算中间位置mid = (low + high) / 2。
3. 判断中间位置的元素是否为目标值:a. 如果mid位置的元素等于目标值,则查找成功。
b. 如果mid位置的元素大于目标值,则将high指针减1,继续查找左半区间。
c. 如果mid位置的元素小于目标值,则将low指针加1,继续查找右半区间。
4. 重复步骤2和3,直到找到目标值或low大于high,表示查找失败。
四、实验内容1. 编写一个折半查找的Python程序。
2. 使用该程序对不同的有序数组进行查找操作,并记录查找时间。
3. 分析折半查找算法的性能。
1. 创建一个有序数组。
2. 定义折半查找函数。
3. 调用折半查找函数,并记录查找结果和查找时间。
4. 修改数组,重复步骤3。
5. 分析实验结果。
六、实验代码```pythondef binary_search(arr, target):low = 0high = len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] > target:high = mid - 1else:low = mid + 1return -1# 创建有序数组arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]# 查找目标值target = 7# 调用折半查找函数result = binary_search(arr, target)# 输出查找结果if result != -1:print(f"元素{target}在数组中的位置为:{result}")else:print(f"元素{target}在数组中不存在")```七、实验结果与分析1. 对于不同的有序数组,折半查找函数均能正确地找到目标值或返回-1表示查找失败。
数据结构-折半查找,哈希查找
一、实验目的熟练掌握顺序查找,折半查找和哈希表等算法的程序实现。
二、实验内容1、实现折半查找的算法编写一个程序,输出在顺序表(1,2,3,4,,6,7,8,9,10)中采用折半查找方法查找关键字9的过程要求:输出查找过程中的比较对象和被查找元素的位置。
2、实现哈希表的相关运算算法编写程序实现哈希表的构造过程。
要求:建立关键字序列(16,74,60,43,54,90,46,31,29,88,77)对应的哈希表A[0...12],哈希函数为H(k)=k%p,并采用开放定址法中的线性探测法解决冲突。
输出构造完成后的哈希表。
程序源代码及运行结果(运行结果可以截图,也可以文字描述分析)1#include<stdio.h>#include<stdlib.h>int fun(int a[],int key){int high=9;int low=0;int mid=(high+low)/2;printf("与之相比较的值为:");while(high>=low){if(key==a[mid]){printf("%-2d",a[mid]);printf("\nkey为数组中第%d个元素\n",mid+1);break;}if(key<a[mid]){ printf("%-2d",a[mid]);high=mid-1;mid=(high+low)/2;}if(key>a[mid]){ printf("%-2d",a[mid]);low=mid+1;mid=(high+low)/2;}}}int main(){int a[10]={1,2,3,4,5,6,7,8,9,10};fun(a,9);system("pause");}运行截图:2#include<stdio.h>int main(){int a[11]={16,74,60,43,54,90,46,31,29,88,77};int A[13]={0};int p=11,H;for(int i=0;i<11;i++){H=a[i]%p;while(A[H]!=0){H++;if(H==12){H=0;}}A[H]=a[i];}for(int i=0;i<13;i++){if(A[i]!=0){printf("%d ",A[i]);}}}运行截图三、小结(不少于100字)感觉好像没有真正理解哈希表,折半查找比较好理解,实现起来也比较容易,自己对代码的熟练程度还不够,课后还会多多练习,查找的方式还有很多,课后应该多看书,对每种算法都有一定的了解。
折半查找判定树的规则
折半查找判定树的规则一、引言折半查找是一种常用的查找算法,它适用于已排序的数组或列表。
该算法通过将查找范围逐步缩小一半来快速定位目标元素。
折半查找判定树是一种可视化折半查找过程的数据结构,它将查找过程表示为一棵树,每个节点代表一个查找步骤。
二、折半查找算法简介折半查找算法的基本思想是:首先确定待查找范围的起始位置和结束位置,然后将查找范围的中间位置与目标元素进行比较。
如果中间位置的元素等于目标元素,则查找成功;如果中间位置的元素大于目标元素,则将查找范围缩小为前半部分;如果中间位置的元素小于目标元素,则将查找范围缩小为后半部分。
重复以上步骤,直到找到目标元素或查找范围为空。
折半查找算法的时间复杂度为O(log n),其中n为待查找范围的大小。
它比线性查找算法的时间复杂度O(n)更高效,尤其适用于大型有序数组或列表的查找操作。
三、折半查找判定树的概念折半查找判定树是一种用于可视化折半查找过程的数据结构。
它将查找过程表示为一棵树,每个节点代表一个查找步骤。
树的根节点表示初始的查找范围,每个节点的子节点表示查找过程中的下一步。
折半查找判定树的每个节点都有三个属性: 1. 值:表示该节点对应的查找范围。
2. 判定条件:表示该节点的查找条件,即中间位置元素与目标元素的比较结果。
3. 子节点:表示下一步的查找范围。
四、折半查找判定树的规则折半查找判定树的规则如下: 1. 根节点的值为整个数组或列表。
2. 如果查找范围为空,则查找失败。
3. 如果查找范围只有一个元素,并且该元素等于目标元素,则查找成功;否则,查找失败。
4. 如果查找范围有多个元素,则进行以下步骤:- 计算查找范围的中间位置。
- 将中间位置的元素与目标元素进行比较。
- 如果中间位置的元素等于目标元素,则查找成功。
- 如果中间位置的元素大于目标元素,则将查找范围缩小为前半部分,并以前半部分为值创建一个子节点。
- 如果中间位置的元素小于目标元素,则将查找范围缩小为后半部分,并以后半部分为值创建一个子节点。
数据结构查找技术验证实验报告
班级:计算机11-2 学号:40 姓名:朱报龙成绩:_________实验十查找技术验证实验一、折半查找验证1. 实验目的⑴掌握折半查找算法的基本思想;⑵掌握折半查找算法的实现方法;⑶掌握折半查找算法的时间性能。
2. 实验内容对给定的有序数组(假设长度为n),查找数组中与给定值k相等的元素.一、设计与编码#include <iostream>using namespace std;#define N 15 //定义常量N 为数组长度void find(int arr[],int key,int i) //折半查找函数{int low=0,high=N-1,mid,j=0; //j计数查找次数while(low<=high){mid=(low+high)/2; //取中间位++j;printf("\n 第%2d次查找low=%2d high=%2d mid=%2d ",j,low,high,mid); //显示每次查找低中高位,查找次数if(arr[mid]==key) //查到数据,跳出循环break;if(arr[mid]<key) //查找的KEY大于中位值,查后半部low=mid+1;elsehigh=mid-1; //查找的KEY小于中位值,查前半部}if(low<=high) //查到数据printf("\n\n经过总共%2d次查找,找到该数字,该数字位于数组第%d 位,\n\n",j,mid+1);//显示查到的数据的值,下标值,总查找次数elseprintf("\n\n没有找到!"); //显示没有找到}void main(){int arr[N],key,i;printf("\n折半查找验证程序,设定被查数据有位,设定为:\n");for(i=0;i<N;i++) //输入15个排好序的数据{arr[i]=i+1;printf("%d ",arr[i]);}printf("\n请输入要查询的数字(-,输入小于等于零的数字退出验证程序):");scanf("%d",&key); //输入KEYwhile(key>0){find(arr,key,N); //调用折半查找函数printf("\n请输入要查询的数字(-,输入小于等于零的数字退出验证程序):");scanf("%d",&key); //输入KEY}}a)程序运行的结果如何?二、二叉排序树的建立1. 实验目的⑴掌握二叉排序树定义和特性;⑵掌握二叉排序树的建立方法;⑶实现基于二叉排序树的查找技术;⑷掌握二叉排序树的查找性能。
Python查找算法之折半查找算法的实现
Python查找算法之折半查找算法的实现⼀、折半查找算法折半查找算法⼜称为⼆分查找算法,折半查找算法是将数据分割成两等份,⾸先⽤键值(要查找的数据)与中间值进⾏⽐较。
如果键值⼩于中间值,可确定要查找的键值在前半段;如果键值⼤于中间值,可确定要查找的键值在后半段。
然后对前半段(后半段)进⾏分割,将其分成两等份,再对⽐键值。
如此循环⽐较、分割,直到找到数据或者确定数据不存在为⽌。
折半查找的缺点是只适⽤于已经初步排序好的数列;优点是查找速度快。
⽣活中也有类似于折半查找的例⼦,例如,猜数字游戏。
在游戏开始之前,⾸先会给出⼀定的数字范围(例如0~100),并在这个范围内选择⼀个数字作为需要被猜的数字。
然后让⽤户去猜,并根据⽤户猜的数字给出提⽰(如猜⼤了或猜⼩了)。
⽤户通常的做法就是先在⼤范围内随意说⼀个数字,然后提⽰猜⼤了/猜⼩了,这样就缩⼩了猜数字的范围,慢慢地就猜到了正确的数字,如下图所⽰。
这种做法与折半查找法类似,都是通过不断缩⼩数字范围来确定数字,如果每次猜的范围值都是区间的中间值,就是折半查找算法了。
例如,已经有排序好的数列:12、45、56、66、77、80、97、101、120,要查找的数据是 101,⽤折半查找步骤如下:步骤1:将数据列出来并找到中间值 77,将 101 与 77 进⾏⽐较,如下图所⽰。
步骤2:将 101 与 77 进⾏⽐较,结果是 101 ⼤于 77,说明要查找的数据在数列的右半段。
此时不考虑左半段的数据,对在右半段的数据再进⾏分割,找中间值。
这次中间值的位置在 97 和 101之间,取 97,将 101 与 97 进⾏⽐较,如下图所⽰。
步骤3:将 101 与 97 进⾏⽐较,结果是 101 ⼤于 97,说明要查找的数据在右半段数列中,此时不考虑左半段的数据,再对剩下的数列分割,找中间值,这次中间值位置是 101,将 101 与 101进⾏⽐较,如下图所⽰。
步骤4:将 101 与 101 进⾏⽐较,所得结果相等,查找完成。
数据结构实验报告折半查找
数据结构实验报告折半查找1. 引言数据结构是计算机科学中非常重要的一门课程,它研究的是数据的组织方式、存储结构和算法设计等内容。
在数据结构中,折半查找(Binary Search)是一种常用的查找算法,可以在有序的数据集合中快速找到目标元素。
本实验报告将介绍折半查找算法的原理、实现过程以及在不同数据规模下的性能分析。
2. 折半查找原理折半查找是一种分而治之的算法,通过比较目标元素与中间元素的大小关系,不断将待查找范围缩小一半,并在所需的时间内逐步逼近目标元素。
具体的折半查找算法如下:1. 设置左边界l和右边界r,初始时l=0,r=n-1(n为数据集合的长度);2. 计算中间元素的下标mid = (l + r) / 2;3. 比较目标元素与中间元素的值,若相等,则返回目标元素的下标;4. 若目标元素小于中间元素的值,则将右边界r更新为mid-1;5. 若目标元素大于中间元素的值,则将左边界l更新为mid+1;6. 重复步骤2-5,直到找到目标元素或区间缩小为空。
折半查找的时间复杂度为O(log n),比顺序查找的时间复杂度O(n)要小得多。
3. 折半查找的实现实现折半查找的关键就是要确定好左边界l和右边界r的初始值,并在每个循环中更新这两个边界的值。
下面是使用Python语言实现折半查找的代码示例:```pythondef binary_search(arr, target):l = 0r = len(arr) - 1while l <= r:mid = (l + r) // 2if arr[mid] == target:return midelif arr[mid] < target:l = mid + 1else:r = mid - 1return -1```在上述代码中,我们通过设置左边界l和右边界r来确定待查找范围。
通过不断更新这两个边界的值,最终可以找到目标元素的位置。
如果找不到目标元素,则返回-1表示查找失败。
数据结构实验---折半查找实验报告
深圳大学实验报告课程名称:数据结构实验项目名称:查找排序之折半查找学院:信息工程学院专业:电子信息工程指导教师:报告人:学号:2009100000 班级:电子1班实验时间:2011年12月2日实验报告提交时间:2011年12月13日教务处制//调用函数Search_Bin,并将函数返回结果放在i中i = Search_Bin(Data, Dnum, skey);printf("----------------------------------------\n");if(i==-1) //若Search_Bin返回值为-1则显示查找失败printf("查找失败!\n");else //不然则执行下面语句{printf("查找成功!\n");printf("查找的数据位置在(%d)\n",i);}printf("查找次数(%d)",icount);printf("\n");return 0;}四、实验结论:实结果图:情况一、能够在待查数组中查找到待查元素情况二、不能够在待查数组中查找到待查元素数据分析基于上面程序运行图可以很明显得知整个算法的实现过程,针对第一个图:1、首先建立一个数组存放待查元素2、针对定值key进行折半查找,第一个图可以得到key=113、mid=(low+high)/2 =(0+5)/2 =2.得到的是ST[2]=33,查找了一次4、判断ST[2]=33大于key=11,即执行high=mid-1=15、mid=(low+high)/2 =(0+1)/2 =0.得到的是ST[0]=11=key,查找成功,查找了两次6、返回待查元素所在位置7、同理。
若查找不成功则返回查找失败五、实验体会:本次实验很简单,只要掌握折半查找算法的原理,那么剩下的就是花时间编写代码和调试程序。
二分查找(折半查找)
⼆分查找(折半查找)⼀、什么是⼆分查找⼆分查找也称折半查找(Binary Search),它是⼀种效率较⾼的查找⽅法。
但是,折半查找要求线性表必须采⽤顺序存储结构,⽽且表中元素按关键字有序排列⼆、算法复杂度⼆分查找的基本思想是将n个元素分成⼤致相等的两部分,取a[n/2]与x做⽐较,如果x=a[n/2],则找到x,算法中⽌;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.时间复杂度即是while循环的次数。
总共有n个元素,渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数由于你n/2^k取整后>=1即令n/2^k=1可得k=log2n,(是以2为底,n的对数)所以时间复杂度可以表⽰O(h)=O(log2n)三、如何理解⼆分查找给定范围0到1000的整数:第⼀次我们选择500,发现偏⼤了,那么下⼀次的选择范围,就变成了1到499:第⼆次我们选择250,发现还是偏⼤了,那么下⼀次的选择范围,就变成了1到249:第三次我们选择125,发现偏⼩了,那么下⼀次的选择范围,就变成了126到249:以此类推,最坏的情况需要猜测多少次呢?答案是 log1000 = 10次,也就是让原本的区间范围进⾏10次 “折半”。
四、代码实现1.⾮递归⽅式1import java.util.Arrays;23public class test07 {4public static void main(String[] args) {5int[] arr = new int[]{15,66,48,9,54,11,87,100,40,8,9,7,12,13};6int key = 11; //要查找的数7 Arrays.sort(arr); //⼆分查找,之前⼀定要对数组进⾏元素排序8 System.out.println(Arrays.toString(arr)); //打印数组9 System.out.println(key+"元素的索引"+binarySearch(arr,key));10 }11public static int binarySearch(int[] array,int key){12//头指针初始位置13int low = 0;14//尾指针初始位置15int high = array.length - 1;16//判断查找的数是否在数组中,如果此处不加判断,则可能报ng.StackOverflowError栈内存溢出17if(low>high||key>array[high]||key<array[low]){18return -1;19 }20while(low<=high){21//计算中间值的索引,防⽌溢出22int mid = low+ (high - low)/2;23if(key==array[mid]){24return mid; //返回查询到的索引位置25 }else if (key>array[mid]){26 low = mid+1; //mid所对应的的值⽐key⼩,key应该在右边27 }else {28 high = mid-1; //mid所对应的的值⽐key⼤,key应该在左边29 }30 }31//若没有,则返回-132return -1;33 }34 }2.⾮递归⽅式1import ng.annotation.ElementType;2import java.util.Arrays;34public class test07 {5public static void main(String[] args) {6int[] arr = new int[]{15,66,48,9,54,11,87,100,40,8,9,7,12,13};7int key = 11; //要查找的数8//头指针初始位置9int low = 0;10//尾指针初始位置11int high = arr.length - 1;12 Arrays.sort(arr); //⼆分查找,之前⼀定要对数组进⾏元素排序13 System.out.println(Arrays.toString(arr)); //打印数组14 System.out.println(key+"元素的索引"+binarySearch(arr,low,high,key));15 }16public static int binarySearch(int[] array,int low,int high,int key){17//判断查找的数是否在数组中,如果此处不加判断,则可能报ng.StackOverflowError栈内存溢出18if(low>high||key>array[high]||key<array[low]){19return -1;20 }21//计算中间值的索引,防⽌溢出22int mid = low+ (high - low)/2;23if (key>array[mid]){24return binarySearch(array,mid+1,high,key); //mid所对应的的值⽐key⼩,key应该在右边25 }else if(key<array[mid]){26return binarySearch(array,low,mid-1,key); //mid所对应的的值⽐key⼤,key应该在左边27 }else{28return mid;29 }30 }31 }⼆分查找中值(mid)计算⼆分查找中值计算有三种⽅式:int mid = (low + high)/ 2;int mid = low + (high - low) / 2;int mid = (high + low) >>> 1上述两种算法看似第⼀种要简洁,第⼆种提取之后,跟第⼀种没有什么区别。
折半查找
折半查找算法思想:将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。
通过一次比较,将查找区间缩小一半。
折半查找是一种高效的查找方法。
它可以明显减少比较次数,提高查找效率。
但是,折半查找的先决条件是查找表中的数据元素必须有序。
算法步骤描述:step1 首先确定整个查找区间的中间位置mid = (left + right )/ 2step2 用待查关键字值与中间位置的关键字值进行比较;若相等,则查找成功若大于,则在后(右)半个区域继续进行折半查找若小于,则在前(左)半个区域继续进行折半查找Step3 对确定的缩小区域再按折半公式,重复上述步骤。
最后,得到结果:要么查找成功,要么查找失败。
折半查找的存储结构采用一维数组存放。
折半查找算法举例对给定数列(有序){ 3,5,11,17,21,23,28,30,32,50},按折半查找算法,查找关键字值为30的数据元素。
折半查找的算法讨论:优点: ASL≤log2n,即每经过一次比较,查找范围就缩小一半。
经log2n 次计较就可以完成查找过程。
缺点:因要求有序,所以要求查找数列必须有序,而对所有数据元素按大小排序是非常费时的操作。
另外,顺序存储结构的插入、删除操作不便利。
#include <iostream>using namespace std;int Find_Half_Line(int low,int high,int Find_Name,int a[])...{while(low <= high)...{int mid = (low + high)/2;if(a[mid] == Find_Name) //如果相等则返回return mid;elseif(Find_Name > a[mid]) //大于查找值最低的值变为折半中间的值low =mid+1;else high=mid-1; //小于最大值变为中间值}return -1;}int main()...{int Find_Name;int low=0,high=9;int a[10]=...{2,3,5,8,10,12,15,17,19,20};cin >> Find_Name;cout <<Find_Half_Line(low,high,Find_Name,a);return 0;}插入排序插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
折半查找算法_实验报告
一、实验目的1. 理解折半查找算法的基本原理和实现方法。
2. 掌握在C语言中实现折半查找算法的技巧。
3. 比较折半查找算法与其他查找算法(如顺序查找)的性能差异。
4. 应用折半查找算法解决实际问题。
二、实验环境1. 编程语言:C语言2. 开发环境:Visual Studio Code3. 操作系统:Windows 10三、实验原理折半查找算法,又称二分查找算法,是一种在有序数组中查找特定元素的查找方法。
其基本原理如下:1. 将查找的有序数组分为左右两部分。
2. 比较查找元素与中间元素的大小关系。
3. 如果查找元素等于中间元素,则查找成功。
4. 如果查找元素小于中间元素,则在左半部分继续查找。
5. 如果查找元素大于中间元素,则在右半部分继续查找。
6. 重复步骤2-5,直到找到目标元素或查找范围为空。
四、实验内容1. 实现折半查找算法。
2. 比较折半查找算法与顺序查找算法的性能。
3. 应用折半查找算法解决实际问题。
五、实验步骤1. 创建一个有序数组。
2. 输入要查找的元素。
3. 使用折半查找算法查找目标元素。
4. 输出查找结果。
六、实验代码```c#include <stdio.h>// 折半查找算法int binary_search(int arr[], int left, int right, int target) { while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid; // 找到目标元素,返回索引} else if (arr[mid] < target) {left = mid + 1; // 在右半部分查找} else {right = mid - 1; // 在左半部分查找}}return -1; // 未找到目标元素}int main() {int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};int n = sizeof(arr) / sizeof(arr[0]);int target;printf("请输入要查找的元素:");scanf("%d", &target);int index = binary_search(arr, 0, n - 1, target);if (index != -1) {printf("找到元素 %d 在数组中的位置:%d\n", target, index);} else {printf("未找到元素 %d\n", target);}return 0;}```七、实验结果与分析1. 折半查找算法的时间复杂度为O(log2n),而顺序查找算法的时间复杂度为O(n)。
折半查找的实验报告
折半查找的实验报告折半查找的实验报告引言:在计算机科学领域,查找是一项基本操作。
而折半查找,也被称为二分查找,是一种高效的查找算法。
本实验旨在通过实际操作和数据分析,探究折半查找算法的原理和性能。
实验设计:本次实验使用C++语言来实现折半查找算法,并通过编写测试程序来验证算法的正确性和性能。
我们使用了一个已排序的整数数组,其中包含了10000个元素。
实验过程中,我们将记录算法的查找次数和运行时间,并与线性查找算法进行对比。
实验步骤:1. 首先,我们定义一个包含10000个已排序整数的数组,并选择一个待查找的目标值。
2. 接下来,我们实现折半查找算法。
该算法的基本思想是将待查找的目标值与数组的中间元素进行比较,如果相等则返回找到的位置,如果目标值小于中间元素,则在左半部分继续查找,否则在右半部分继续查找。
重复这个过程,直到找到目标值或者确定目标值不存在。
3. 我们编写测试程序,分别使用折半查找算法和线性查找算法来查找目标值,并记录查找次数和运行时间。
4. 重复多次实验,以获得更准确的结果。
同时,我们还可以改变目标值的位置,观察算法的性能变化。
实验结果:经过多次实验,我们得到了如下结果:- 折半查找算法的平均查找次数为log2(10000)≈13次,而线性查找算法的平均查找次数为10000次。
- 折半查找算法的平均运行时间为0.0001秒,而线性查找算法的平均运行时间为0.01秒。
- 当目标值位于数组的中间位置时,折半查找算法的性能最佳;而当目标值位于数组的两端时,折半查找算法的性能最差。
讨论与分析:通过对实验结果的分析,我们可以得出以下结论:1. 折半查找算法的时间复杂度为O(log n),而线性查找算法的时间复杂度为O(n)。
因此,折半查找算法在大规模数据中的查找效率远高于线性查找算法。
2. 折半查找算法适用于已排序的数据集,而线性查找算法对数据集的有序性没有要求。
因此,在已排序的数据集中使用折半查找算法可以提高查找效率。
顺序查找与折半查找实验报告
顺序查找与折半查找实验报告姓名:许严班级:计122 学号:12130230501.问题描述实现顺序查找与折半查找的程序设计,并比较两种查找方法的性能。
2.基本要求(1)设计查找表的存储结构。
(2)设计查找算法,对同一组实验数据实现查找。
(3)输入:查找表的数据个数和数据由键盘输入,数据元素类型为整型,以菜单方式选择顺序查找或折半查找中的一种,并由键盘输入想要查找的数据。
(4)输出:若查找成功输出其位置和查找次数,若查找失败输出信息和查找次数。
3.实现提示(1)存储设计由于要对一组实验数据实现顺序查找与折半查找,只能采用顺序表存放查找表数据,存储结构定义与教材一致。
设关键字类型为整型,利用前面实验建立的线性表类,生成一个线性表对象,线性表中的数据个数、数据以及待查找的数据由键盘输入。
(2)算法设计由于折半查找法要求数据是有序的,可设立一个创建有序顺序表的函数Sort(int*fp,int length);设立一个顺序查找函数SequenSearch(int*fp,int length)实现顺序查找;设立一个折半查找函数实现折半查找;编写一个主函数main(),在主函数中设计一个简单的菜单,根据用户的选择分别调用顺序查找和折半查找算法。
4.程序设计(1) using namespace std;struct Node{int key;};class SSearch{private:Node *ST;int len;public:SSearch();~SSearch();void Create(int n);void Display();void Sort();void Sort_n(int arr[]);void SequenceSearch(int key);void Search(int key);};SSearch::SSearch(){ST=0;len=0;}SSearch::~SSearch(){if(ST) delete[]ST;len=0;}void SSearch::Create(int n){len=n;ST=new Node[len];cout<<"请输入"<<n<<"个数据元素:\n";int i=0;while(i<len){cin>>ST[i].key;i++;}cout<<"静态表创建成功!:)\n";}void SSearch::Display(){cout<<"表中数据元素依次为:\n";for(int i=0;i<len;i++)cout<<ST[i].key<<'\t';cout<<endl;}voidSSearch::Sort() //冒泡排序{int t;for(int i=1;i<len;i++){bool y=1;for(int j=0;j<len-i;j++){if(ST[j].key>ST[j+1].key){t=ST[j].key;ST[j].key=ST[j+1].key;ST[j+1].key=t;y=0;}}if(y) return;}}void SSearch::Sort_n(int arr[]){int t;for(int i=1;i<len;i++){bool y=1;for(int j=0;j<len-i;j++){if(arr[j]>arr[j+1]){t=arr[j];arr[j]=arr[j+1];arr[j+1]=t;y=0;}}if(y) return;}}void SSearch::SequenceSearch(int key){ST[0].key=key;int count=1,i=len-1; //计数边梁count为1的原因是下面的for语句先判定在count++ for(;ST[i].key!=key;i--,count++);if(i){cout<<"查找成功!\n在顺序表的第"<<i<<"个位置(从0开始),一共比较了"<<count<<"次。
数据结构实验报告-BST存储结构与折半查找
实验报告课程名称:数据结构与算法课程类型:必修实验项目:树型查找结构与排序方法实验题目:BST存储结构与折半查找一、实验目的1. 理解二叉查找树的存储结构。
2. 掌握BST的插入、删除、查找、排序等多种算法。
3. 掌握折半查找算法。
4. 学会计算BST的查找成功及失败的平均查找长度。
5. 学会计算折半查找的查找成功及失败的平均查找长度。
二、实验要求及实验环境实验要求:1. 设计BST 的左右链存储结构,并实现BST插入(建立)、删除、查找和排序算法。
2. 实现折半查找算法。
3. 实验比较:设计并产生实验测试数据,考察比较两种查找方法的时间性能,并与理论结果进行比较。
以下具体做法可作为参考:4. 第1组测试数据: n=1024个已排序的整数序列(如0至2048之间的奇数);第2组测试数据:第1组测试数据的随机序列。
5. 按上述两组序列的顺序作为输入顺序,分别建立BST。
6. 编写程序计算所建的两棵BST的查找成功和查找失败的平均查找长度(主要是改造Search算法,对“比较”进行计数),并与理论结果比较。
7. 以上述BST的中序遍历序列作为折半查找的输入,编写程序分别计算折半查找的查找成功和查找失败的平均查找长度,并与理论结果比较。
8. 以上实验能否说明:就平均性能而言,BST的查找与折半查找差不多,为什么?实验环境:codeblocks/Dev-C++三、设计思想(本程序中的用到的所有数据抽象数据性ADT的定义,主程序的流程图及各程序模块之间的调用关系)1. 所用的抽象数据性ADT的定义1)逻辑结构:BST树:二叉查找树是一个满足以下条件的树:任意一个结点的关键字,都大于(小于)其左(右)子树中任意结点的关键字,因此各结点的关键字互不相同按中序遍历二叉查找树所得的中序序列是一个递增的有序序列,因此,二叉查找树可以把无序序列变为有序序列。
同一个数据集合,可按关键字表示成不同的二叉查找树,即同一数据集合的二叉查找树不唯一;但中序序列相同。
分治算法折半查找实验总结
分治算法折半查找实验总结导言:分治算法是一种常用的问题解决方法,其核心思想是将问题划分为更小的子问题进行解决,最后将子问题的解合并得到原问题的解。
折半查找是一种高效的查找算法,适用于有序数组。
本文将结合实验结果对分治算法折半查找进行总结和分析。
一、算法原理折半查找(Binary Search)是一种基于分治思想的查找算法。
假设有一个有序数组arr,要查找的元素为target。
首先,取数组的中间元素mid。
若target等于mid,则查找成功;若target小于mid,则在数组的左半部分继续查找;若target大于mid,则在数组的右半部分继续查找。
通过不断地折半查找,最终可以确定是否存在目标元素,并找到其位置。
二、实验过程为了验证折半查找算法的效果,我们在实验中使用了一个有序数组arr,并设定了不同的查找目标。
实验步骤如下:1. 初始化一个有序数组arr;2. 输入要查找的目标元素target;3. 调用折半查找函数,传入数组arr和目标元素target;4. 根据查找结果输出查找成功或失败的信息。
三、实验结果我们进行了多次实验,分别在不同规模的有序数组中查找不同的目标元素。
以下是实验结果的总结:1. 当目标元素存在于数组中时,折半查找能够准确找到目标元素的位置,并输出查找成功的信息。
这证明了折半查找的正确性和有效性。
2. 当目标元素不存在于数组中时,折半查找会返回查找失败的信息。
这表明算法能够正确判断目标元素的存在与否。
四、实验分析通过实验结果的总结,我们可以得出以下分析:1. 折半查找算法的时间复杂度为O(logn),其中n为数组的长度。
相比于线性查找算法的时间复杂度O(n),折半查找具有更高的效率。
2. 折半查找算法要求数组必须是有序的,否则无法正常运行。
因此,在使用折半查找算法之前,需要确保数组的有序性。
3. 折半查找算法对内存空间的要求较低,只需要存储数组和几个变量即可。
这使得折半查找算法适用于大规模数据的查找。
验证实验-折半查找
验证实验-折半查找一、折半查找-实验目的对给定的有序数组(假设长度为n),查找数组中与给定值k相等的元素。
二、折半查找-实验过程1、算法思想将数列按有序化排列(升序),查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为前半部分,否则为后半部分。
通过一次比较,将查找区间缩小一半。
2、变量I:循环变量.J:查找次数计数器Key:需查找的值.Low:刚开始为第一个值所对应的下标.High:刚开始为最后一个值所对应的下标.Mid:第一个与最后一个值所对应下标和的一半Arr:一维数组,用来存放15个数据.3、步骤➢读取一组15个已升序排列的数据。
➢取出15个数最中间下标的数与关键字进行比较,进行查找➢若关键字等于这个数的话,则查找成功➢若关键字小于这个数的话,则范围缩小为表的前半部分➢若关键字大于这个数的话,则范围缩小为表的后半部分➢重复执行3)4)5)过程,直到low>high为止。
➢输出各次查询low,high,mid值,总查询次数,验证折半算法4、折半查找-流程图5、折半查找-程序代码/* 对给定的有序数组(假设长度为n),查找数组中与给定值k相等的元素。
*/ #include <stdio.h>#include "stdafx.h"#define N 15 //定义常量N 为数组长度void find(int arr[],int key,int i) //折半查找函数{int low=0,high=N-1,mid,j=0; //j计数查找次数while(low<=high){mid=(low+high)/2; //取中间位++j;printf("\n 第%2d次查找 low=%2d high=%2d mid=%2d",j,low,high,mid); //显示每次查找低中高位,查找次数if(arr[mid]==key) //查到数据,跳出循环break;if(arr[mid]<key) //查找的KEY大于中位值,查后半部low=mid+1;elsehigh=mid-1; //查找的KEY小于中位值,查前半部}if(low<=high) //查到数据printf("\n\n经过总共%2d次查找,找到该数字,该数字位于数组第%d 位,\n\n",j,mid+1);//显示查到的数据的值,下标值,总查找次数elseprintf("\n\n没有找到!"); //显示没有找到}void main(){int arr[N],key,i;printf("\n折半查找验证程序,设定被查数据有位,设定为:\n");for(i=0;i<N;i++) //输入15个排好序的数据{arr[i]=i+1;printf("%d ",arr[i]);}printf("\n请输入要查询的数字(-,输入小于等于零的数字退出验证程序):");scanf("%d",&key); //输入KEYwhile(key>0){find(arr,key,N); //调用折半查找函数printf("\n请输入要查询的数字(-,输入小于等于零的数字退出验证程序):");scanf("%d",&key); //输入KEY}}6、折半查找-运行结果输入一个数值为1至15的有序一维数据,查询2,7,8的结果的截屏。
折半查找的实验报告
折半查找的实验报告
《折半查找的实验报告》
在计算机科学领域中,折半查找是一种常用的搜索算法,也被称为二分查找。
它的原理是在有序数组中查找特定元素的位置,通过将数组分成两部分并逐步
缩小搜索范围来实现。
本实验旨在验证折半查找算法的效率和准确性,以及探
讨其在实际应用中的优势和局限性。
实验过程分为以下几个步骤:
1. 数据准备:首先,我们准备了多组有序数组作为输入数据,每组数组包含不
同数量的元素。
这些数组涵盖了各种规模的数据集,以便全面测试折半查找算
法的性能。
2. 算法实现:我们编写了折半查找算法的实现代码,并在不同规模的数据集上
进行了测试。
算法的实现包括了边界条件的处理、搜索范围的缩小和结果的返
回等关键步骤。
3. 实验设计:为了验证折半查找算法的准确性和效率,我们设计了一系列实验,包括查找存在的元素、查找不存在的元素以及对比折半查找和线性查找算法的
性能。
4. 实验结果:通过对实验数据的分析和对比,我们得出了折半查找算法在不同
规模数据集上的搜索耗时和准确率。
同时,我们也探讨了折半查找算法相对于
线性查找算法的优势和局限性。
5. 结论与展望:最后,我们总结了实验结果,并对折半查找算法在实际应用中
的潜在价值和改进方向进行了展望。
通过本次实验,我们对折半查找算法有了更深入的理解,同时也为其在实际应
用中的优化和推广提供了一些思路。
希望本实验报告能够对相关领域的研究和应用有所启发,为进一步探索折半查找算法的性能和潜力提供参考。
实验12:顺序查找、折半查找实验报告
深圳大学实验报告课程名称:数据结构实验与课程设计实验项目名称:顺序查找、折半查找实验学院:计算机与软件学院专业:指导教师:**报告人:学号:班级:实验时间:实验报告提交时间:教务处制一、实验目的1、掌握顺序查找、折半查找算法的基本思想2、掌握顺序查找、折半查找算法的实现方法3、掌握顺序查找、折半查找的时间性能二、实验要求1、熟悉C++语言编程2、了解顺序查找、折半查找的原理三、实验内容本次实验有两项必做内容和一项选作内容:(一)顺序查找实验1、问题描述给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始,要求使用带哨兵的顺序查找算法2、顺序查找算法⑴、在表的第0位置,赋给定值Key⑵、从表中最后一个记录开始⑶、逐个进行记录的关键字和给定值Key的比较⑷、若某个记录比较相等,则查找成功⑸、若直到第1个记录都比较不等,则查找不成功3、输入第一行输入n,表示队列有n个数据第二行输入n个数据,都是正整数,用空格隔开第三行输入t,表示有t个要查找的数值第四行起,输入t个数值,输入t行4、输入样本833 66 22 88 11 27 44 5532211995、输出每行输出一个要查找的数值在队列的位置,如果查找不成功,输出字符串error6、输出样本35error(二)折半查找实验1、问题描述在一个有序序列中,折半查找一个关键字;返回查找是否成功,如果成功,输入关键字所在的位置和查找次数。
2、查找算法⑴、n个对象从小到大存放在有序顺序表BinList中,Key为给定值⑵、设low、high指向待查元素所在区间的下界、上界,即low=1, high=BinListLen⑶、设mid指向待查区间的中点,即mid=(low+high)/2⑷、让Key与mid指向的记录关键字比较若Key=BinList[mid],查找成功,结束若Key<BinList[mid],则high=mid-1 [上半区间]若Key>BinList[mid],则low=mid+1 [下半区间]⑸、重复⑶、⑷操作,直至low>high时,查找失败。
折半查找 插入排序 高斯消去法实验报告
算法设计与分析基础应用数学学院二零一六年六月实验三折半查找插入排序和高斯消去法一、实验性质由算法伪代码设计java代码二、实验学时3学时三、实验目的1、理解折半查找的算法过程,并设计相应的java程序。
2、理解插入排序的算法过程,并设计相应的java程序。
3、理解高斯消去法的算法过程,并设计相应的java程序。
四、实验要求实验一、折半查找:由用户在输入要查询的数字,经运行程序,实现非递归的折半查找,并输出用户所查数字所在位置。
实验二、插入排序:由用户输入一串数字(7个),按照提示要求输入。
经插入排序,将用户输入数字进行排序输出,并可以给出出入排序过程。
实验三、高斯消去法:给定一个方程组的系数矩阵及一个解向量,通过高斯消去法,将矩阵变为上三角矩阵,从而快速求出矩阵所在方程的解。
五、实验内容实验一、折半查找:1、实现非递归的折半查找。
2、输入:一个升序数组a[],和一个需要查找的数组k。
3、输出:一个数组k元素的下标,如果没有查找到,则提示用户。
实验二、插入排序:1、用插入排序对给定的数字进行排序。
2、输入:n个可以排序元素构成的数组a[];3、输出:非降序的依次输出排列数组a[]。
实验三、高斯消去法:1、对一个方程组的系数矩阵a[][],应用高斯消元法。
2、用该方程组右边的值构成的向量b来扩展矩阵。
3、输出:一个可以代替a[][]的上三角等阶矩阵图,相应的右边的值位于最后一列。
实验报告实验一折半查找:Java代码:package cn;import java.util.Scanner;public class ZheBan {public static void main(String[] args){int []a={3,14,27,31,39,42,55,70,74,81,85,93,98};Scanner can = new Scanner(System.in);System.out.println("请输入要查找的数字:");int k=can.nextInt();int l=0,r=a.length;while(l<=r){int m;m=(l+r)/2;if(k==a[m]){System.out.print("您查找的数字在第"+(m+1)+"位");break;}else if(k<a[m]){r=m-1;}else {l=m+1;}}if(l>r){System.out.print("未找到您要查找的数字。
软件测试-折半查找程序
例:一个折半查找程序可搜索按字母顺序排列的名字列表, 如果功能测试,应该使用哪些测试用例?
答:为了对这个折半查找程序进行功能测试,应该使用下 述测试用例: ①查找列表中第一个名字 预期的输出:TRUE
② 查找列表中最后一个名字 预期的输出:TRUE
③ 查找第一个名字后的名字 预期的输出:TRUE
④ 查找最后一个名字前的名字 预期的输出:TRUE
⑤ 查找位于列表中间的一个名字 预期的输出:TRUE
⑥ 查找不在列表中但按字母顺序恰好在第一个名字 后的名字。
预期的输出:FALSE ⑦ 查找不在列表中但按字母顺序恰好在最后一个名 字前的名字。
预期的输出:FALSE
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
验证实验-折半查找
一、折半查找-实验目的
对给定的有序数组(假设长度为n),查找数组中与给定值k相等的元素。
二、折半查找-实验过程
1、算法思想
将数列按有序化排列(升序),查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为前半部分,否则为后半部分。
通过一次比较,将查找区间缩小一半。
2、变量
I:循环变量.
J:查找次数计数器
Key:需查找的值.
Low:刚开始为第一个值所对应的下标.
High:刚开始为最后一个值所对应的下标.
Mid:第一个与最后一个值所对应下标和的一半
Arr:一维数组,用来存放15个数据.
3、步骤
➢读取一组15个已升序排列的数据。
➢取出15个数最中间下标的数与关键字进行比较,进行查找
➢若关键字等于这个数的话,则查找成功
➢若关键字小于这个数的话,则范围缩小为表的前半部分
➢若关键字大于这个数的话,则范围缩小为表的后半部分
➢重复执行3)4)5)过程,直到low>high为止。
➢输出各次查询low,high,mid值,总查询次数,验证折半算法
4、折半查找-流程图
5、折半查找-程序代码
/* 对给定的有序数组(假设长度为n),查找数组中与给定值k相等的元素。
*/ #include <stdio.h>
#include "stdafx.h"
#define N 15 //定义常量N 为数组长度
void find(int arr[],int key,int i) //折半查找函数
{
int low=0,high=N-1,mid,j=0; //j计数查找次数
while(low<=high)
{
mid=(low+high)/2; //取中间位
++j;
printf("\n 第%2d次查找 low=%2d high=%2d mid=%2d
",j,low,high,mid); //显示每次查找低中高位,查找次数
if(arr[mid]==key) //查到数据,跳出循环
break;
if(arr[mid]<key) //查找的KEY大于中位值,查后半部
low=mid+1;
else
high=mid-1; //查找的KEY小于中位值,查前半部}
if(low<=high) //查到数据
printf("\n\n经过总共%2d次查找,找到该数字,该数字位于数组第%d 位,\n\n",j,mid+1);//显示查到的数据的值,下标值,总查找次数
else
printf("\n\n没有找到!"); //显示没有找到
}
void main()
{
int arr[N],key,i;
printf("\n折半查找验证程序,设定被查数据有位,设定为:\n");
for(i=0;i<N;i++) //输入15个排好序的数据
{
arr[i]=i+1;
printf("%d ",arr[i]);
}
printf("\n请输入要查询的数字(-,输入小于等于零的数字退出验证程序):");
scanf("%d",&key); //输入KEY
while(key>0)
{
find(arr,key,N); //调用折半查找函数
printf("\n请输入要查询的数字(-,输入小于等于零的数字退出验证程序):");
scanf("%d",&key); //输入KEY
}
}
6、折半查找-运行结果
输入一个数值为1至15的有序一维数据,查询2,7,8的结果的截屏。
7、折半查找-时间性能
折半算法的时间复杂度O(N)≤log2n,即每经过一次比较,查找范围就缩小一半。
经log2n 次计较可以完成查找过程。
四、折半查找-小结
折半查找是一种高效的查找方法。
它可以明显减少比较次数,提高查找效率,而且程序实现也较为简单。
但是,折半查找的先决条件是查找表中的数据元素必须有序,而对所有数据元素按大小排序是非常费时的操作,因而,还需撑握更高效的排序与查询方法。
协同作业试验四-直方图
2008年11月
一、实验要求-直方图
1.关键码的数据类型是整型,且用数组存储;
2.求出每个关键码在数组中出现的次数;
3.输出直方图。
二、实验流程-直方图
三、算法思想-直方图
1.建立一个与关键码个数相同的数组,数组元素为一个结构体,包含关键码及
频率累加计数器。
利用数组下标与关键码的对应关系(本例中,数组下标对应关键码减1),把输入的需统计关键码对应到相应的数组元素,并对该元素中的频率累加器进行计数,统计其出现频率。
2.使用冒泡排序法,对数组以频率数为序进行降序排列,输出整个数组内容,
使用此算法能非常简洁的表示直方图。
四、算法说明-直方图
说明:使用结构体,是为了确保排序时关键码与频率之间的对应关系,可以以少量空量换取较简洁的程序设计与时间性能。
五、算法设计概要-直方图
➢data 自定义结构,用于存放关键码及关键码出现的次数
➢data.datanumber 关键码
➢data.datatimes 关键码出现的次数
➢number 直方图结构数组
➢t 临时结构体,用于排序交换的临时变量
➢i 循环变量
➢j 循环变量
➢key 关键码,对应直方图结构数组下标
六、步骤
1) 初始化直方图结构,定义每个关键码,初始化关键码频率累加计数器为0
2) 循环接受关键码,并且根据输入的关键码找到相对应的元素,对关键码频
率累加计数器累加计数
3) 对直方图中进行排序,排序规则根据关键码出现的频率降序
4) 输出直方图
七、时间性能-直方图
本程序中,使用了冒泡算法对数组进行了排序,这也是本程序中最大的时间复杂度,所以本程序与冒泡排序算法的时间复杂度一致为O(n^2 )。
八、运行结果-直方图
九、直方图――程序代码
// 直方图
#include "stdafx.h"
#include "stdio.h"
#define N 10 //输入次数10次
#define R 5 //统计数字1-5
struct data
{
int datanumber; //存放预定数据(1-5) 如果仅用数组,无法解决排序后,被统计数与频率的对应关系
int datatimes; //存放出现次数
};
void main()
{
struct data number[R],t;
int key=0,j,i;
for(i=0;i<R;i++)//初始化
{
number[i].datanumber=i+1;
number[i].datatimes=0;
}
printf("请输入数据,测试数据范围控制在1-5之间:\n");
i = 0;
while(i<N) {
scanf("%d",&key);
//如果输入有误,则继续循环,直到输入正确后,累加计数器,进行下个数据的输入
if(key<1 || key>5)
{
printf("输入数据有误,请重新输入\n");
continue;
}
number[key-1].datatimes++;
i++;
}
for(i=0;i<R;i++) //冒泡排序法对数组进行排序
{
for(j=R-1;j>i;j--)
{
if(number[j-1].datatimes<number[j].datatimes)
{
t=number[j-1];number[j-1]=number[j];number[j]=t;
}
}
}
printf("\n\n 关键码频率\n");
for(int i=0;i<R;i++)
printf("%8d %8d\n",number[i].datanumber,number[i].datatimes);
}
十、小结-直方图
本实验,我们小组采用了一维结构数组,比较好的解决了关键码与频率在排序后,无法对应的问题。
如果采用一维数组,关键码由数组下标承担,数组元素表示频率,这样,排完序后,关键码与频率完全对不上号,频率高的永远是1,所以无法采用;如果采用二维数组,空间与时间复杂度都会增加,解决方法也会更复杂些。
一维结构数组较好地解决了该问题,在牺牲极有限空间的情况下,换取了简洁的程序设计与比较好的时间性能。
附:《数据结构》协同作业第三组组员表(略)。