插值查找

Posted maguanyue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插值查找相关的知识,希望对你有一定的参考价值。

概念介绍

  有同学想了解插值查找,今天它来了!想了解插值查找,就得先了解二分查找的原理,对于不知道二分查找的小伙伴,可以去简单学习一下,送上超链接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,如果发现不足之处,请联系我进行更改,十分感谢!关注我,为你揭秘更多查找算法!

以上是关于插值查找的主要内容,如果未能解决你的问题,请参考以下文章

算法插值查找算法

leetcode查找算法(顺序查找,二分法,斐波那契查找,插值查找,分块查找)

[Algorithm]二分插值斐波那契查找算法 Java 代码实现

[Algorithm]二分插值斐波那契查找算法 Java 代码实现

如何在片段着色器中找到 4 个顶点之间的插值位置?

Day569.插值查找 -数据结构和算法Java