折半查找、插值查找以及斐波那契查找

1. 折半查找

        关键公式: mid = (low + high)/2 = low + 1/2(high - low).

        其时间复杂度为O(logn),因为n个节点的完全二叉树的深度为[log2n]+1. [X]表示不大于X的最大整数。


2. 插值查找

        根据插值法的思想,其本质和折半查找没有区别。

        关键公式:mid = low + (high - low)*(key - a[low])/(a[high] - a[low]);

        其时间复杂度仍为O(logn),但对于表比较长且分布较均匀的查找表而言,插值查找算法的平均性能高于折半查找。


3. 斐波那契查找

        其思想与折半查找、插值查找没有多大区别,本质上只是分割点的选择不同。斐波那契查找需要构造斐波那契数列,该数列的作用就是提供分割点(好多算法书都没有介绍清楚啊!!!)

        (1) 算法首先找到构造一个查找表,即在原来的数组上添加元素,使得该查找表(数组)的长度为某个斐波那契值减1,即F(k)-1;

        (2) 设置当前的分隔为mid = low + F[k-1] -1. 至于为什么这么设置分割点?我认为是斐波那契数列的特点,即后一项是前两项之和,这前两项正好对应着查找表的左右两部分。可以简单的理解为一种特殊的分割点设置方法;

(3) 当key = a[mid]时,查找成功;当key<a[mid]时,新范围是第low个到第mid-1个,此时范围个数为F[k-1]-1个;当key>a[mid]时,新范围是第m+1个到第high个,此时范围个数为F[k-2]-1个。

        (4) 最后将mid与查找表的长度n进行比较,若不大于查找表的长度,则mid为查找到的位置;否则,mid为不全补全数值处的位置。

其时间复杂度仍为O(logn)。


三者查找算法的比较

折半查找是进行加法与除法运算(mid = (low+high)/2),插值查找进行复杂的四则运算(mid = low + (high - low)*(key - a[low])/(a[high] - a[low])),而斐波那契查找只是简单的加减运算(mid=low+F[k-1]-1)。这三种查找的时间复杂度均为O(logn),不过,根据不同的数据特点来选择查找方法,能够很大程度上提高查找的效率。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值