内插搜索(插值查找)是改良版的二分搜索。二分搜索总是基于中间位置上的值为参照物,而内插搜索会选择接近查找的值作为参照物。
条件:要求算法已经排序
原理:
比如已知:一个数组[1,2,3,4,5,6,7,8,9],查询7的位置。
如果是二分法会选择中间一个值作为参数。而内插搜索,会选择一个接近该值的数作为参数。
二分法参数值:
演变一下:
由此可以看到我门是从一半取值,如果我们是查询图书馆中名字序号从A-Z,我们不能取M,而是取偏向于字典前面一些开始,缩小范围。
步骤如下:
- 选择期望比例 delta = (选择的值-最小值)/(最大值-最小值)
- 参考下标 position = 最小值 + Math.floort((最大值-最小值) * delta )
const interpolationSearch = (array,value) => {
const {length} =array
let low = 0
let high = length-1
let position = -1
let delta = -1
while(low<high) {
delta = (value-array[low])/(array[high]-array[low])
position = low + Math.floor((high - low) * delta);
if (array[position] === value) {
return position
}
if (array[position] < value) {
low = position +1
} else {
high = position -1
}
}
}
console.log(interpolationSearch([1,2,3,4,5,6,7,8,9],6));
内插搜索的高效性只针对均匀分布的数组,而对于分布不均匀的数组,插值查找便不再适用了。