【和我一起学算法】查找篇——插值查找

目录

四、插值查找

算法原理

举例

第一次查找

代码实现


在被查找数列中选取比较点(参考点)时,二分法采用的是中点,Fibonacci法采用的是黄金分割点。二分查找法是最直观的,Fibonacci查找法可能是最"美观",但都不是最科学的。那么如何选取最科学的那个比较点(参考点)呢?通常情况下被查找数列都不是等差的,也不知道数列的差值分布状态,没有办法确定到底选择哪个点作为"最优解"。插值算法则给出了一个大多数情况下的理论上最科学的比较点(参照点)。

插值查找多用于等差数列的查找。

四、插值查找

算法原理

mid=left+(key-iList[left])*(right-left)/(iList[right]-iList[left])

举例

第一次查找

以iList为被查找数列、key=7为例开始查找。

当前iList=range(0,10)=[0,1,2,3,4,5,6,7,8,9],是一个差值为1的等差数列,在插值查找给出的公式中的mid为参考点,left为被查找数列列首的下标,right为被查找数列列尾的下标,如下图所示:

从图中可以看到,第一次查找就找到了被查找数,在搜索等差数列时,插值查找是可能最快速的一种方法了。

代码实现

insertSort.py

from randomList import randomList
from quickSort import quickSort
import random

iList = quickSort(randomList(20))

def insertSearch(iList, key):
    print("iList = %s" %str(iList))
    print("Find The number : %d" %key)
    iLen = len(iList)
    left = 0 
    right = iLen -1

    while right - left > 1:
        mid = left + (key - iList[left]) * (right - left) // (iList[right] - iList[left])
        if mid == left:
            mid += 1 #当iList[right]和iList[left]相差太大时,有可能导致mid一直都等于left,从而陷入死循环
        if key < iList[mid]:
            right = mid
        elif key > iList[mid]:
            left = mid
        else:
            return mid
    if key == iList[left]:
        return left
    elif key == iList[right]:
        return right
    else:
        return -1


if __name__ == "__main__":
    keys = [random.choice(iList), random.randrange(min(iList), max(iList))]
    for key in keys:
        res = insertSearch(iList, key)
        if res >= 0:
            print("%d is in the list, index is : %d\n" %(key, res))
        else:
            print("%d is not in the list\n" %key)

 

往期推荐:

排序篇:

【和我一起学算法】排序篇——冒泡排序

【和我一起学算法】排序篇——选择排序

【和我一起学算法】排序篇——插入排序

【和我一起学算法】排序篇——归并排序

【和我一起学算法】排序篇——快速排序

【和我一起学算法】排序篇——计数排序

【和我一起学算法】排序篇——总结

查找篇:

【和我一起学算法】查找篇——顺序查找

【和我一起学算法】查找篇——二分查找

如果喜欢这个系列的文章可以订阅我的算法设计与分析专栏,每天更新~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二琳爱吃肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值