插值查找(Interpolation Search )
插值查找是在折半查找的基础上进行优化,不过也只是在部分情况下能达到最好情况。
适用条件:
- 适合于关键字值分布均匀的集合。
- 有序排列
关键公式
mi 代表 查找点mid
lo 代表 low
hi 代表 high
e 代表 查找的值
代码实现
public static int InterpolationSearch(int[] arr, int lo, int hi, int e) {
//注意:e < arr[0] 和 arr[arr.length - 1] < e 必须需要
//否则我们得到的 mi 可能越界
if (lo > hi || e < arr[lo] || arr[hi] < e) {
return -1;
}
// 求出mi
int mi = lo + (hi - lo) * (e - arr[lo]) / (arr[hi] - arr[lo]);
if (e < arr[mi]) { // 说明应该向左边递归
return InterpolationSearch(arr, lo, mi - 1, e);
} else if (arr[mi] < e) { // 向右边递归查找
return InterpolationSearch(arr, mid + 1, hi, e);
} else {
return mid;
}
}
注:
对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找, 速度较快.