基本介绍
插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。在数据分布均匀时效率高(联想斜率恒定)
即 int mid = left + (right – left) * (findVal – arr[left]) / (arr[right])
代码实现
/**
* 插值查找,要求数组有序
*
* @param arr 数组
* @param left 左索引
* @param right 右索引
* @param value 查找值
* @return 所在索引
*/
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;
}
}
补充说明
- 对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快。
- 关键字分布不均匀的情况下,该方法不一定比折半查找要。