• 插值查找


    概念介绍

      有同学想了解插值查找,今天它来了!想了解插值查找,就得先了解二分查找的原理,对于不知道二分查找的小伙伴,可以去简单学习一下,送上超链接https://www.cnblogs.com/maguanyue/p/11675567.html。插值查找和二分查找十分的相似,它们唯一的区别就是:二分查找的每次查找点=(最大值+最小值)/2,是一个固定值。而插值查找的每次查找点的下标=最小值+ (最大值- 最小值) * (目标值- a[最小值下表]) / (a[最大值下表] - a[最小值下表]),这样做的目的是为了使得查找点变为自适应选择,从而提高查找的效率。

      我们还是用二分查找中的数组举例子,这次我们的需求是在arr=[1,3,5,7,9,10,13,18],找到1。

      二分查找:

      在二分查找的算法中记录被调用打印日志,说明二分查找被调用了。

      二分查找的过程在这里我们就不进行推导了,直接看二分查找的结果。

      对二分查找进行调用。

      结果:

      说明在arr=[1,3,5,7,9,10,13,18],找到1,二分查找被调用了3次。

      插值查找:

      先带入公式,获取中值及其下标int mid = start + (end - start) * (findValue - arr[start]) / (arr[end] - arr[start]),int midValue = arr[mid];

      int mid = 0+(7-0)*(1-1)/(18-1)=0,int midValue = arr[0]=1,找到目标值,而且只是一次。

      咱们看看代码,对插值查找进行调用:

       看一下插值查找调用结果:

       说明插值查找只被调用了1次,就找到了目标值,是不是感觉很爽。既然有了插值查找,我们是不是不需要知道二分查找了呢?答案是否定的,对于元素分布比较均匀的查找表来说,采用插值查找,速度是比较快的,但是分布不均匀的情况下,插值查找不一定比二分查找好。

    代码实现

      插值查找和二分查找代码及其相似,相信大家很快就能明白,仅有获取中值的方式不同罢了。

     1     public static int insertValueSearch(int[] arr, int start, int end, int findValue) {
     2         System.out.println("插值查找被调用了!");
     3         if (end > start || findValue < arr[0] || findValue > arr[arr.length - 1]) {
     4             return -1;
     5         }
     6 
     7         // 动态获取中值及其下标
     8         int mid = start + (end - start) * (findValue - arr[start]) / (arr[end] - arr[start]);
     9         int midValue = arr[mid];
    10 
    11         // 比较中值:右递归的情况
    12         if (findValue > midValue) {
    13             return insertValueSearch(arr, mid + 1, end, findValue);
    14             // 比较中值:左递归的情况
    15         } else if (findValue < midValue) {
    16             return insertValueSearch(arr, start, mid - 1, findValue);
    17         } else {
    18             return mid;
    19         }
    20     }

      至此,代码编写完成,Git地址:https://github.com/HollowCup/algorithms-and-data-structure,具体实现位于algorithm工程下的search目录InsertValueSearch,如果发现不足之处,请联系我进行更改,十分感谢!关注我,为你揭秘更多查找算法!

  • 相关阅读:
    Python—使用列表构造队列数据结构
    js数组及对象去重
    当z-index遇上transform
    echarts y轴百分比显示
    在vue-cli项目中使用echarts
    IE中在a标签里的图片会显示边框
    css 三种清除浮动(float)的方法
    js技巧
    深入理解 函数、匿名函数、自执行函数
    即时反应的input和propertychange方法
  • 原文地址:https://www.cnblogs.com/maguanyue/p/11769283.html
Copyright © 2020-2023  润新知