0 概述
根据插值法的思想,其本质和折半查找没有区别。参阅折半查找、插值查找以及斐波那契查找
关键公式:mid = low + (high - low)*(key - a[low])/(a[high] - a[low]);
其时间复杂度仍为O(logn)
,但对于表比较长且分布较均匀的查找表而言,插值查找算法的平均性能高于折半查找。
1 代码实现
public int interpolationSearch(int[] A, int target, int n, int key){
int low = 0, high = n, mid;
while(low <= high){
mid = low + (high - low) * (key - A[low]/(A[high] - a[low]));
if(A[mid] == target){
return mid;
}else if(A[mid] > target){
high = mid - 1;
}else{
low = mid + 1;
}
}
return -1;
}
注意:
- 循环的判定条件:
low <= high
- 为防止数据溢出,
mid = low + (high - low) * (key - A[low]/(A[high] - a[low]));