插值查找

来源:互联网 发布:中国现代汉语词典软件 编辑:程序博客网 时间:2024/05/16 01:43

原文来源:数据结构--向量--插值查找 - Codeman的专栏 - 博客频道 - CSDN.NET

转载已获得原作者许可


我们来看一下插值查找。

本页内容

    1.插值查找原理

    2.代码实现

    3.总结评价

1.插值查找原理

          插值查找的前提是有序数列元素的值是成线性增长的。对于大多数有序数列来说,这前提是可以成立的。我们不妨假设它就是成立的,那样,当我们知道一个要查找值的大小后。就可以根据数列线性增长的性质,求出要查找的值在数列中的大概位置。比如说在数列A[lo,hi)中查找e。我们设e的下标为mi。由于数列线性增长,我们不难得到这个等式:

  

进而得出:

          

我们可求出mi的值,以它为轴点,可以极大的提高查找的收敛速度。说到这里,大家也都明白了,其实插值查找就是更准的二分查找而已。

2.代码实现

[cpp] view plain copy
  1. #include<iostream>  
  2. using namespace std;  
  3. int InterpolationSearch(int *A,int e,int lo,int hi)  
  4. {  
  5.     while(lo<hi)  
  6.     {  
  7.         int mi=lo+(hi-lo-1)*(e-A[lo])/(A[hi-1]-A[lo]);//获取查找轴点   
  8.         if(mi>=10)//排除越界情况   
  9.         {  
  10.             return -1;  
  11.         }  
  12.         if(e<A[mi])  
  13.         {  
  14.             hi=mi;//深入左侧[lo,hi)   
  15.         }  
  16.         else if(e>A[mi])  
  17.         {  
  18.             lo=mi+1;//深入右侧[mi+1,hi)   
  19.         }  
  20.         else  
  21.         {  
  22.             return mi;//命中   
  23.         }  
  24.     }  
  25.     return -1;//查找失败   
  26. }  
  27. int main()  
  28. {  
  29.     /*******插值查找测试******/  
  30.     int a[10];  
  31.     cout<<"测试数组:";  
  32.     for(int i=0;i<10;i++)  
  33.     {  
  34.         a[i]=(float)(i);  
  35.         cout<<a[i]<<" ";   
  36.     }  
  37.     cout<<endl;  
  38.     cout<<"查找结果:" ;  
  39.     for(int i=0;i<13;i++)  
  40.     {  
  41.         cout<<InterpolationSearch(a,i-1,0,10)<<" ";   
  42.     }   
  43.     cout<<endl;  
  44.     /***************************/  
  45.        
  46. }   
运行结果:

         

3.总体评价

    插值查找比二分查找有所改进,但是其效率提高的并不明显(除非所查找的数列特别庞大,它的用处才能显现)。算法中引用了乘法和除法,增加了额外的消耗。如果所需查找的数列不大,由于每次深入都要进行乘除操作,用此算法可能得不偿失。所以,在实际应用中,该算法常常与二分查找算法联合使用,来处理较大的数据:用插值查找将数据缩小到一定范围,再用二分查找完成查询。



想要学习更多关于向量的知识,请点击!!


0 0