顺序查找&二分查找&索引查找
1.查找技术的分类。如下图:
2.什么是顺序查找呢?(无序表)
顺序查找的原理很简单,就是遍历整个列表,逐个进行记录的关键字与给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录。如果直到最后一个记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找失败。
时间复杂度是O(n)
3.二分查找(前提就是有序表)
二分查找的基本思想是:
在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到找到为止。
从二分查找的定义我们可以看出,使用二分查找有两个前提条件:
(1)待查找的列表必须有序(通常是从小到大的顺序)。
(2)必须使用线性表的顺序存储结构来存储数据(底层用数组实现的)。
时间复杂度是O(logn),可以看到远远好于顺序查找的O(n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class BinSearch{ int min,max,mid; public static int halfSearch( int [] arr, int key){ int min= 0 ; int max=arr.length- 1 ; int mid=(max+min)/ 2 ; while (arr[mid]!=key){ if (key>arr[mid]){ min=mid+ 1 ; } else { max=mid- 1 ; } if (min>max) return - 1 ; mid=(max+min)/ 2 ; } return mid; } public static void main(String[] args){ int [] arr={ 3 , 5 , 7 , 9 , 10 , 14 }; //有序的,从小到大排的 int index=halfSearch(arr, 7 ); //要查找7,返回的是索引值 System.out.println(halfSearch(arr, 7 )); } } |
4.索引查找
关于索引,我们很容易地联想到数据库中的索引,建立了索引,可以大大提高数据库的查询速度。
索引查找又称为分块查找,是一种介于顺序查找和二分查找之间的一种查找方法。
分块查找的基本思想是:
首先查找索引表,可用二分查找或顺序查找(因为块间是有序的,可以用二分查找),
然后根据块首指针找到相应的块,并在确定的块中进行顺序查找。
满足两个条件:
(1)块内无序,每一块内的记录不要求有序。
(2)块间有序,如第二块记录的所有关键字要大于第一块,第三块的要大于第二块
分块查找的时间复杂度为O(√n)。
在实现索引查找算法前需要弄清楚以下三个术语。
(1)主表。即要查找的对象。
(2)索引项。一般我们会将主表分成几个子表,每个子表建立一个索引,这个索引就叫索引项。
(3)索引表。即索引项的集合。
同时,索引项包括以下三点。
(1)最大关键码,就是存储的每一块中的最大关键字(那一块中数字最大的那个)
(2)块长,就是每一块的元素个数
(3)块首指针,就是每一块第一个元素的指针
栗子1:
有个长度为12的无重复有序表,按折半查找法进行查找,在表内各元素等概率情况下,查找成功所需的平均比较(三元比较)的次数为(37/12)
解释:
此题按照一颗完全二叉树来考虑,12个结点是4层,所以为(1*1+2*2+4*3+5*4)/12
栗子2:
有如下一个类似跳表的数据结构:每层都是已经排好序的链表,level1层的链表有所有元素,levelN层的链表只有levelN-1的1半的元素,levelN层的结点指向levelN-1层中相同的结点。请问查找一个元素的时间复杂度是:
解释:
这是一个类似二分查找的算法:时间复杂度O(logn)
总共有n个元素,
渐渐跟下去就是n,n/2,n/4,....n/2^k,其中k就是循环的次数
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
所以时间复杂度可以表示O()=O(logn)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· DeepSeek V3 两周使用总结
· 回顾我的软件开发经历(1)
· C#使用yield关键字提升迭代性能与效率
· 低成本高可用方案!Linux系统下SQL Server数据库镜像配置全流程详解
· 4. 使用sql查询excel内容