查找算法①-插值查找/插补查找

一、原理说明

        插值查找算法又称插补查找算法,它是二分查找算法的改进版。查找算法的原理: 利用数据的分布,利用公式预测键值所在的位置,快速缩小键值所在的序列区间,从而快速找到待查找的值。

        简单来说,利用公式计算出middle值,middle就是你查找的数据target大致所在的位置,然后比较就能找到这个值所在的位置,你需要做的是记住下面的公式:

二、键值索引计算公式

mid = left + int(
            (target - data[left]) * (right - left) / (data[right] - data[left])
        )

三、实现过程

在[18, 19, 22, 24, 56, 60, 66, 77, 88]序列中,快速找到66这个数据,实现过程如下:

# 自定义插补查找函数
def insret_seach(data, target):
    # 待查找序列的左侧边
    left = 0
    # 待查找序列的右侧边
    right = 8
    # 循环判断左侧小于等于右侧且键值不等于-1 。输入-1代表结束程序。
    while left <= right and target != -1:
        # 用插补查找核心 计算出边界位置
        mid = left + int(
            (target - data[left]) * (right - left) / (data[right] - data[left])
        )
        # 如果目标值等于边界值
        if target == data[mid]:
            # 返回边界位置
            return mid
        # 如果目标值小于边界值
        elif target < data[mid]:
            # 输出在左半边查找
            print(
                "%d介于位置%d[%d]和边界值%d[%d]之间,找左半边"
                % (target, left + 1, data[left], mid + 1, data[mid])
            )
            # 最高位等于边界位置减1
            right = mid - 1
        # 如果目标值大于边界值
        elif target > data[mid]:
            # 输出在右半边查找
            print(
                "%d介于边界值位置%d[%d]和%d[%d]之间,找右半边"
                % (target, mid + 1, data[mid], right + 1, data[right])
            )
            # 最低位等于边界位置加1
            left = mid + 1
    # 自定义函数到此结束
    return -1


# 即将查找的目标值
target = 66
# 待查找的数列
data = [18, 19, 22, 24, 56, 60, 66, 77, 88]

i = insret_seach(data, target)
print(i)

一次就找到了,运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

灰灰老师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值