JavaScript算法---搜索(内插搜索)

内插搜索(插值查找)是改良版的二分搜索。二分搜索总是基于中间位置上的值为参照物,而内插搜索会选择接近查找的值作为参照物。

条件:要求算法已经排序

原理
比如已知:一个数组[1,2,3,4,5,6,7,8,9],查询7的位置。
如果是二分法会选择中间一个值作为参数。而内插搜索,会选择一个接近该值的数作为参数。

二分法参数值:
在这里插入图片描述
演变一下:
在这里插入图片描述
由此可以看到我门是从一半取值,如果我们是查询图书馆中名字序号从A-Z,我们不能取M,而是取偏向于字典前面一些开始,缩小范围。

步骤如下

  1. 选择期望比例 delta = (选择的值-最小值)/(最大值-最小值)
  2. 参考下标 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));

内插搜索的高效性只针对均匀分布的数组,而对于分布不均匀的数组,插值查找便不再适用了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值