zoukankan      html  css  js  c++  java
  • 插值查找

    插值查找

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

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

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

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

    插值查找也就不再适用。

  • 相关阅读:
    pandas Dataframe filter
    process xlsx with pandas
    data manipulate in excel with easyExcel class
    modify registry in user environment
    add number line in vim
    java import webservice
    ctypes MessageBoxA
    music 163 lyrics
    【python实例】自动贩卖机
    【python基础】sys模块(库)方法汇总
  • 原文地址:https://www.cnblogs.com/zhoubo123/p/11258795.html
Copyright © 2011-2022 走看看