插值查找
插值查找其实是折半查找的升级版,在我们写折半查找的时候不知道大家想过没有
为什么每次要折一半呢?1/4不行吗?1/8不行吗?这样我们就可以想到,是不是可
以找到更精准的“折半”的方式来处理呢。
在折半查找中 mid=(high+low)/2; 转化一下变成:mid=low+1/2*(high-low);
我们可以看到 “(high-low)”的系数为1/2,但是我们想找一个自适应的系数以便于找到
目标数与下标为mid所对应的数更加的接近,我们就要将这个系数更改掉,让程序自己
去找与目标数更加接近的数。
于是我们就将程序优化成 mid=low+((key-A[low])/(A[high]-A[low]))*(high-low);
这样我们就找到这个自适应的系数了,这样查找起来也就更快。
利用插值查找 :查找成功或者失败的时间复杂度均为O(log2(log2n))。
c++代码实现:
int InsertionSearch(int A[],int high,int key,int low)//high当前数组下标的最大值,low为当前数组下标的最小值; { if(low>high) return -1;//查找失败。 int mid=low+((key-A[low])/(A[high]-A[low]))*(high-low); if(key==A[mid]) return mid; if(key>A[mid]) return InsertionSearch(A,high,key,mid+1); if(key<A[mid]) return InsertionSearch(A,mid-1,key,low); }
插值查找比折半查找要快,其与折半查找的原理一样,也要求序列是有序的,
缺点也是一样,如果序列在程序运行的时候需要多次改变序列的顺序,那么
插值查找也就不再适用。