二分查找比较次数_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...

顺序查找

基本思想

属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素。

这是最基本的查找方法,也是时间复杂度最高的查找算法。

在数据过多时,这种方法并不适用。

代码实现

e981f58b1539d7c52d3d50da6c852805.png

分块查找

2e6512daaf152f20b54c0184f024ea88.png

基本思想

属于顺序查找的改进方法,又叫索引顺序查找。

将n个元素分成m块(m<=n),每个块中元素可以没有顺序,但是m个块之间是有序排列,所以特别适合于节点动态变化的情况。

分块查找的速度虽然不如二分查找算法,但比顺序查找算法快得多,同时又不需要对全部节点进行排序。当节点很多且块数很大时,对索引表可以采用折半查找,这样能够进一步提高查找的速度。

那么索引表的构成就是每个块中的最大元素。

查找方式是先对索引表进行二分或顺序查找,选出目标值应该所在的块,然后在块内进行顺序查找。

二分查找

393e5f96002470a607b08f0fe4705068.png

基本思想

属于有序查找算法,也叫折半查找,就是将数组每次选取一半进行查找,怎么选取一半就需要让中间值与目标值value进行比较,因为有序,所以中间值小于目标值则选取后半部分,大于目标值则选取前半部分,依此类推,直到找出与目标值相等的元素,否则返回-1或null。

这种方法有效的缩减查找次数和查找范围,适用于数据量比较大的有序表。

因为前提是有序表,所以对于插入删除等操作过多的数据集并不适用,因为在排序算法上浪费的时间会比较多。

一般的时间复杂度是O(log2n)

代码实现

d6c173b09ad288fce2184fe94ff02aea.png

插值查找

基本思想

属于二分查找的改进版,二分查找一直重复一半一半的操作,这种操作比较固定,并不会根据目标值的大小进行自适应分段和选择,而插值查找可以根据目标值value进行自适应。

下面是百度词条对插值的解释:插值类似于平常查英文字典的方法,在查一个以字母C开头的英文单词时,决不会用二分查找,从字典的中间一页开始,因为知道它的大概位置是在字典的较前面的部分,因此可以从前面的某处查起。

0995d4e28c8ed32a48c7f658cce91c08.png

既然是二分查找的改进版,那么就要找关键点进行改进,二分是取1/2的有序表进行查找,那么mid就是关键点,二分中mid=(low+high)/2,可以转化成mid=low+(high-low)/2,所以相当于(high-low)/2中的1/2就是所分的比例,那么可以对mid进行改进,mid=low+low+(value-list[low])/(list[high]-list[low])*(high-low),(value-list[low])/(list[high]-list[low])就是所分的比例。

根据目标值在整个有序表中所处的位置,让mid的变化更靠近目标值value,这样也就间接地减少了比较次数。

这种方法适用于关键字分布均匀的有序表。

复杂度为O(log2(log2n))

代码实现

22a41653500789f3c16f380d48a743a4.png

斐波那契查找

基本思想

斐波那契数列与0.618有着奇妙的关联,随着斐波那契数列的递增,前后两个数的比值会越来越接近0.618,所以可以将黄金比例运用到查找中。

百度词条:斐波那契搜索,斐波那契搜索就是在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于略大于查找表中元素个数的数F(n),将原查找表扩展为长度为F(n)(如果要补充元素,则补充重复最后一个元素,直到满足F[n]个元素),完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,找出要查找的元素在那一部分并递归,直到找到。

这个方法比较重要,所以百度词条上讲的很清楚!

代码实现

b71080894fef8272f0025de1a5883826.png
7ad9e3fae14c62c76694cc44eb193f00.png

总结

  • 还剩下两种非常重要的查找算法,就是树表和哈希,这两种我就单独写,ball ball大佬们不要嫌弃!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值