原理介绍
插值查找是基于上一篇博客介绍的二分法查找的改进,将查找点的选择改进为自适应选择,可以提高查找效率。主要是mid的选取不同。
- 二分查找中 mid的确定:mid=(left+right)/2=left + 1/2 * (right-left)
- 插值查找中 mid的确定:mid=left+(target-a[left]) /(arr[right]-arr[left])* (right-left)
应用场景:
- 当数据量大且数组元素比较均匀时,插值查找效率>二分查找
- 当数组元素分布不均匀时,插值查找不一定二分查找
JAVA代码实现
与二分法的不同:
mid = left + (right - left) * (value - arr[left]) / (arr[right] - arr[left])
- 必须判断mid是否越界。
if (left > right || value < arr[0] || value > arr[arr.length - 1])
public class InsertValueSerach {
public static void main(String[] args) {
int[] arr = new int[100];
for (int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
int index = insertValueSearch(arr,0,arr.length-1,99);
System.out.println(index);
}
public static int insertValueSearch(int[] arr, int left, int right, int value){
//与二分法判断条件不同的是 value < arr[0] || value > arr[arr.length - 1] 是必要的,否则mid可能越界
if (left > right || value < arr[0] || value > arr[arr.length - 1]){
return -1;
}
int mid = left + (right - left) * (value - arr[left]) / (arr[right] - arr[left]);
int midValue = arr[mid];
if(value > midValue){
return insertValueSearch(arr,mid+1,right,value);
}else if (value < midValue){
return insertValueSearch(arr,left, mid-1,value);
}else {
return mid;
}
}
}