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);    
    }

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

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

    插值查找也就不再适用。

  • 相关阅读:
    运用vue-awesome-swiper实现一个slide居中一个缩小显示
    IntersectionObserver
    leetcode 加一
    Cuda总结
    webrtc 视频数据 采集 发送 接收 显示
    webrtc ice代码流程走读
    webrtc sdp 组建 流程以及 sdp协议解析
    webrtc 视频参数配置
    webrtc 线程整理
    webrtc turn协议
  • 原文地址:https://www.cnblogs.com/zhoubo123/p/11258795.html
Copyright © 2011-2022 走看看