二分查找之进阶(插值查找)

Interpolation Search

1. 二分查找即是折半查找,即把数据分成2份进行比较判断。(前提是有序列表)

  1. 二分查找代码
function bsearch (list,item) { //有序队列的二分查找
    let lindex = 0
    let hindex = list.length-1
    let mid
    while (lindex<=hindex) {
        mid = Math.floor((lindex+hindex)/2)
        let guess = list[mid]
        if(guess==item){
            return mid
        }else if(guess>item){
            hindex = mid - 1
        }else{
            lindex = mid + 1
        }
    }
    return null
}

2. 如果要查找的数十分接近于low端或者height端,那么用四分查找会比二分查找更快(如何找到类似于二分或者四分的这个值?)

  1. 插值查找代码
function interpolationSearch (list,searchItem) {
    let low = 0
    let height = list.length-1
    let mid
    while (low<=height) {
        mid = Math.floor(low+(height-low)*((searchItem-list[low])/(list[height]-list[low])))
        let guess = list[mid]
        if(guess==searchItem){
            return mid
        }else if(guess>searchItem){
            height = mid - 1
        }else{
            low = mid + 1
        }
    }
    return null
}

3. 插值查找与二分查找关键不同在于找mid值所用的公式

二分查找:mid=low+(height-low)/2=(low+height)/2
插值查找:mid=low+(height-low)*((item-list[low])/(list[height]-list[low]))
从而可知,当(item-list[low])/(list[height]-list[low])=1/2时就为二分查找

  1. 插值查找适用范围

1.插值查找的前提同样是有序列表
2.而且列表中的值是均匀分布的,如果列表是 [1,2,3,1000,10000,100000] 这样值不均匀分布的情况,则不适合
(插值查找的本质就是用查找值来推断mid下标索引的位置)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值