插值查找
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 代码实现