Python插值查找算法详解与代码实现
本文详细介绍Python中的插值查找算法,作为折半查找的改进版,它通过特定公式预测键值位置以缩小搜索范围。文章包含核心公式解析、具体查找步骤演示以及完整的Python代码实现,帮助用户快速掌握该算法的应用。
一、插补查找算法
插补查找算法,亦称插值查找,是对折半查找算法的一种优化改进。该算法依据数据的分布特征,利用特定公式预测目标键值可能存在的索引位置,从而快速缩小搜索区间,逐步逼近目标数据直至找到为止。从原理上看,插值查找类似于日常查阅英文字典的方式:当查找以字母D开头的单词时,人们不会从字典中间开始折半查找,而是根据字母顺序直接定位到字典前部区域进行查找。
middle=left+(target-data[left])/(data[right]-data[left])*(right-left)
参数说明:
- middle:计算得出的边界索引。
- left:数组最左侧元素的索引。
- target:目标键值(即要查找的数据)。
- data[left]:数组最左侧元素的值。
- data[right]:数组最右侧元素的值。
- right:数组最右侧元素的索引。
例如,给定一个已排序的数列:34、53、57、68、72、81、89、93、99。若要查找的数据是53,使用插值查找法的执行步骤如下:
步骤1:列出数据列并利用公式计算边界索引,具体计算过程如下:
将各项数据代入公式:

对计算结果取整,得到所求索引为2,对应数据为57。将查找目标数据53与57进行比较,如下图所示。

步骤2:比较53与57,由于53小于57,因此需在57的左半部分继续查找,忽略右半部分数据。此时索引范围缩小至0和2之间,再次代入公式:

取整后索引为1,对应数据为53。将查找目标数据53与53进行比较,如下图所示:

步骤3:比较53与53,两者相等,查找完成。说明:如果经过多次分割仍未找到相等的值,则表明该键值不在当前数列中。
通过上述步骤1可以看出,插值查找算法相比折半查找,其每次取值范围更小,因此查找速度通常快于折半查找,这也是插值查找算法的主要优势。
二、实例:利用插补查找用户输入的数据
用户可以任意输入一组数据,例如本实例中输入一组数据:34、53、57、68、72、81、89、93、99。在这组数据中,使用插值查找法分别查找数据57、53、93、89、100,并显示每次查找的过程。使用Python代码实现此过程,具体代码如下:
def insert_search(data, num):
"""
自定义查找函数:该函数使用的是插补查找算法
:param data: 原数列data
:param num: 键值num
:return:
"""
# 计算
left_index = 0 # 最左侧数据的索引
right_index = len(data) - 1 # 最右侧数据的索引
print("正在查找.......") # 提示
while left_index <= right_index:
# 使用公式计算出索引值
middle = left_index + (num - data[left_index]) / (data[right_index] - data[left_index]) * (
right_index - left_index)
# 取整
middle = int(middle)
# print(middle)
if num == data[middle]:
return middle # 如果键值等于边界值,返回边界位置
elif num < data[middle]:
# 输出位置在数列中的左半边
print(f"{num} 介于位置{left_index + 1}[{data[left_index]}]和边界值{middle + 1}[{data[middle]}]之间,找左半边......")
right_index = middle - 1 # 如果键值小于边界值,最右边数据索引等于边界位置减1
else:
# 输出位置在数列中的左半边
print(f"{num} 介于位置{middle + 1}[{data[middle]}]和边界值{right_index + 1}[{data[right_index]}]之间,找右半边......")
left_index = middle + 1 # 如果键值大于边界值,最左边数据索引等于边界位置加1
return -1 # 自定义函数到此结束
inp_num = 0 # 定义变量,用来输入键值
num_list = [34, 53, 57, 68, 72, 81, 89, 93, 99] # 定义数列
print("数据内容是:")
for index, ele in enumerate(num_list):
print(f" {index + 1}[{ele}]", end="") # 输出数列
print("")
flag = True # 开关,用来管控是否多次查找
while flag: # 循环查找
inp_num = int(input("请输入要查找的键值:").strip()) # 输入查找键值
result = insert_search(num_list, inp_num) # 调用自定义的查找函数——insert_search()函数
if result == -1: # 判断查找结果是否是-1
print(f"没有找到[{inp_num}]") # 若为-1,提示没有找到值
else:
# 若不为-1,提示查找位置
print(f"在{result + 1}个位置找到[{inp_num}]")
char = input("本次查找结束,是否继续查找,请输入 y(Y) 或 n(N):").strip()
if char.upper() == "N":
flag = False
程序执行结果如下图所示:

到此这篇关于Python查找算法之插补查找算法的实现的文章就介绍到这了,更多相关Python 插补查找算法内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













