一、原理说明
插值查找算法又称插补查找算法,它是二分查找算法的改进版。查找算法的原理: 利用数据的分布,利用公式预测键值所在的位置,快速缩小键值所在的序列区间,从而快速找到待查找的值。
简单来说,利用公式计算出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)
一次就找到了,运行结果如下: