查找又称检索,是指在某种数据结构中找出满足给定条件的元素。若在查找的同时对表做修改运算(如插入删除),则相应的表称为动态查找表,否则,称为静态查找表。我们分别从线性表查找,树表查找和哈希表查找来分析总结查找算法。
线性表查找
线性表是最简单的一种表的组织方式,我们不考虑在查找的同时对表做修改,即在静态表上进行查找
1)顺序查找
基本思路:
从表中一端开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至顺序扫描结束,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功
基本代码:
int SeqSearch(int a[],int len,int key) { int i for( i=0;i<len;i++) { if(a[i]==key) break; } if(i<len) return i;//查找成功,返回下标 else return -1;//查找失败,返回-1 }
特点:
顺序查找成功时的查找平均长度为(n+1)/2,即为表长的一半,查找不成功的查找长度为n,顺序查找的优点是算法简单,且对表的结构没有任何要求。缺点就是查找效率低,当n较大时不宜采用顺序查找。
2)二分查找(折半查找)
基本思路:
将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。
基本代码:
int BinSearch(int a[],int len,int key) { int low=0,high=len-1,mid; while(low<=high) { mid=(low+high)/2; if(a[mid]==key)//查找成功 return mid; else if(a[mid]>key) high=mid-1; else low=mid+1; } return -1;//查找失败 }
特点:
二分查找成功时的平均查找长度为:log2(n+1)-1 。二分查找虽然高效,但是要将表按关键字排序,而排序本身就是一种很费时的运算。二分查找必须采用顺序存储结构,为保表的有序性,在顺序表中插入或删除都必将移动大量数据。因此,二分查找特别适合用于那种一建立就很少改动,而又经常需要查找的线性表
3)分块查找(索引顺序查找)
基本思想
分块查找是一种介于顺序查找和二分查找之间的查找方式。查找时,首先查找索引表,因为索引表是有顺序的表,故可二分查找或顺序查找确定待查的记录在哪一块;然后在确定的块中进行顺序查找(因为块内无序,只能顺序查找)
结构展示:
基本代码
int Search_Index(SSTable &ST,IndexTable &ID,int k) { int low,high,mid; int p;//p用来保存查找的关键字所属的索引中的位置 int s,t;//s,t分别用来保存查找的关键字所在块的起始和终点位置 low=0; high=ID.length-1; while(low<=high && p<0) {//该循环是用对半查找的方法,对索引表进行查找,从而定位要查找的元素所在的块 mid=(low+high)/2; if(k>ID.elem[mid-1].key && k<ID.elem[mid].key) p=mid;//判断关键字对应哪个索引位置,就是k比前一个值大,比后一个值小, //那个大的就是k对应的索引位置 else { if(k<ID.elem[mid].key) high=mid-1; else if(k>ID.elem[mid].key) low=mid+1; else p=mid; } } s=ID.elem[p].stadr; if(p==ID.length-1) t=ST.length;//这里对p的判断很重要,p若是索引中最后一个位置,则t应该为ST的表长 else t=ID.elem[p+1].stadr-1; while(k!=ST.r[s]&&s<=t)//这里在块里进行顺序查找 s++; if(s>t) return 0; else return s; }
特点:
分块查找实际上是两次查找过程,分块查找的效率结余顺序查找和二分查找之间。分块查找的优点是,在表中插入或删除一个记录时,只要找到记录所属的块,就在该块内进行插入和删除运算。因为块内数据存放是无序的,所以无需移动大量记录。分块查找主要代价(缺点)是要增加一个辅助数组的存储空间和将初始表分块排序的运算。
总结
当用线性表作为表组织形式时,其中以二分查找效率最高。但由于二分查找要求表中记录有序,且不能以链表形式存储,因此,在标的插入和删除操作频繁时,为维护标的有序性,需要移动大量记录。这些大量的移动引起的额外时间开销就抵消了二分查找的优点了。所以二分查找只适用于静态表查找。若要对动态表进行高效查找,可用树表查找,下片博客将介绍树表查找。
相关推荐
(1)掌握顺序查找,二分法查找和索引查找的算法思想及程序实现方法。 (2)掌握二叉排序树、AVL树的查找、插入、删除、建立算法的思想及程序实现方法。 (3)掌握散列存储结构的思想,能选择合适散列函数,实现...
顺序和二分查找 课程设计 数组顺序查找 链表顺序查找 C语言编程
理解顺序表的定义掌握顺序表的检索、插入、删除等算法的实现 实现顺序表完成线性表的基本操作: 初始化线性表、清空线性表、求线性表长度、检查线性表是否为空、遍历线性表、从线性表中查找元素、从线性表中查找与...
折半查找算法在顺序表中插入一个元素讲解.pdf
数据结构课程设计-综合查找算法(顺序查找、折半查找、二叉排序树、哈希表) 可以在Microsoft Visual C++ 上运行没有错误 包括论文word文档,答辩的ppt等
数据结构与算法-学生成绩管理系统(以顺序表来实现)
排序、二分法查找、树遍历等常见算法实现 顺序表 Python中的list和tuple两种类型采用了顺序表的实现技术 链表 单向链表 双向链表 单向循环链表 栈 队列 FIFO队列 LIFO队列 优先队列(Priority Queue) 双端队列...
折半查找算法 顺序表 数据结构顺序表查找(C语言版)
折半查找算法 顺序表 折半查找算法C语言版
顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
Python版数据结构与算法-查找算法源代码,含顺序搜索、二分查找、哈希表搜索、树(图)数据查找源代码
静态查找表技术 依据顺序查找算法和折半查找算法的特点,对下面的两个查找表选择一个合适的算法 ,设计出完整的C源程序。并完成问题: 查找表1 : { 8 ,15 ,19 ,26 ,33 ,41 ,47 ,52 ,64 ,90 } ,查找key =...
2.3顺序查找算法描述 - 5 - 2.4运行结果 - 6 - 三 折半查找的分析、程序、及运行结果 - 6 - 3.1系统简介 - 6 - 3.2设计思路 - 6 - 3.3折半查找算法描述 - 7 - 3.4运行结果 - 8 - 四 二叉排序树查找的分析、程序、及...
一、实验目的: 熟悉各种查找算法及其复杂性,能够根据实际情况选择合适的存储结构。 二、实验要求: 1、掌握查找的基本方法。 2、提交实验报告,报告...编程分别对有序顺序表的顺序查找,二分查找算法进行实现。
搭配顺序表的创建与操作适用更佳哦
是顺序表查找的几种基本算法,顺序查找,改进的顺序查找,快速顺序查找,有序表的顺序查找
常用的查表算法,顺序表查找 又叫做线性查找,是查找算法中最基本的查找,它的过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所...
有序顺序表的二分查找的递归算法.pdf
5.3.3 Knuth-Morris-Pratt子字符串查找算法 496 5.3.4 Boyer-Moore字符串查找算法 502 5.3.5 Rabin-Karp指纹字符串查找算法 505 5.3.6 总结 509 5.4 正则表达式 514 5.4.1 使用正则表达式描述模式 ...