插值查找

插值查找

插值查找其实是折半查找的升级版,在我们写折半查找的时候不知道大家想过没有

为什么每次要折一半呢?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);    
}

插值查找比折半查找要快,其与折半查找的原理一样,也要求序列是有序的,

缺点也是一样,如果序列在程序运行的时候需要多次改变序列的顺序,那么

插值查找也就不再适用。

原文地址:https://www.cnblogs.com/zhoubo123/p/11258795.html