1、插值查找原理介绍
(1)插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。
(2)将折半查找中的求mid 索引的公式 , low 表示左边索,high表示右边索引,key 就是要查找的值
这里要提一下,插值查找的前提是数组是有序的。
(3)举例说明插值查找算法 1-100 的数组
数组 arr = [1, 2, 3, ......., 100]。假如我们需要查找的值 1,使用二分查找的话,我们需要多次递归,才能找到 1。
使用插值查找算法
int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])
int mid = 0 + (99 - 0) * (1 - 1)/ (100 - 1) = 0 + 99 * 0 / 99 = 0
比如我们查找的值 100
int mid = 0 + (99 - 0) * (100 - 1) / (100 - 1) = 0 + 99 * 99 / 99 = 0 + 99 = 99
2、插值查找应用案例
请对一个有序数组进行插值查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就返回-1。
//【默认升序】
//差值查找
//如果找到就返回对应的下标,如果没有找到,就返回-1
public static int insertValueSearch(int[] arr,int left,int right,int findValue){
System.out.println("Hello");
//退出条件
//findValue < arr[0]和findValue > arr[arr.length - 1]必须有
//否则mid 可能越界
if (left > right || findValue < arr[0] || findValue > arr[arr.length - 1]) {
return -1;
}
//求出mid
int mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]);
int midValue = arr[mid];
if (findValue > midValue) {
// 向右递归
return insertValueSearch(arr, mid + 1, right, findValue);
} else if (findValue < midValue) {
return insertValueSearch(arr, left, mid - 1, findValue);
} else {
return mid;
}
}
3、插值查找注意事项
(1)对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找, 速度较快;
(2)关键字分布不均匀的情况下,该方法不一定比折半查找要好。