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

来源:互联网 发布:hammer.js中文文档 编辑:程序博客网 时间:2024/06/15 16:36

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 0
原创粉丝点击