7-2插值查找
插值查找
算法介绍
-
插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查
找。 -
将折半查找中的求mid索引的公式,low表示左边索引,high表示右边索引.

-
int midIndex = low + (high - low) * (key - arr[|ow])/ (ar[high]- arr[|ow]) ; /* 插值索引 */
-
举例说明插值查找算法1-100的数组
*算法原理
在二分查找的基础上进一步的约束数据,要求数据是有序且数值分布均匀的,可以获得更加高效的“插值查找”算法
所以,可以改变二分查找的区间缩减策略,根据搜索的值来确定区间缩减幅度,使其不再是固定的1/2,这种想法就是“插值查找”,其中间位置计算方式如下:

如果alpha用于衡量搜索目标值距离左边界的远近,就可以使用下述公式进行表达,其中tar(key)表示目标值,D(arr)表述有序数值:

此时,如果目标值tar和左边界值D[left]差的多,则中间位置mid更靠右;如果目标值tar和左边界值差的少,则中间位置mid更靠左。也就是说,插值查找算法的中间位置mid不是真的在中间了,而是根据目标值和边界值的关系动态的确定。
插值查找算法和二分查找算法的区别主要就在于中间位置mid的确定,它们在终止条件和判断条件上都是相同,在此不做重复。
图解

代码实现
package com.company.search;
/**
* @Function :
* date 2021/5/18 - 14:18
* How :
*/
public class InserValueSearch {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9};
int index = inserValueSearch(arr,8);
System.out.println(index);
}
public static int inserValueSearch(int srcArray[], int key) {
int start = 0;
int end = srcArray.length - 1;
int mid = start+(end-start)*(key-srcArray[start])/(srcArray[end]-srcArray[start]);
while (start <= end) {
mid = (end - start) / 2 + start;
if (key == srcArray[mid]){
return mid+1;
}
if (key < srcArray[mid]) {
end = mid - 1;
}
if (key > srcArray[mid]) {
start = mid + 1;
}
}
return -1;
}
}

浙公网安备 33010602011771号