时间:2021-05-23
插补查找算法又称为插值查找,它是折半查找算法的改进版。插补查找是按照数据的分布,利用公式预测键值所在的位置,快速缩小键值所在序列的范围,慢慢逼近,直到查找到数据为止。根据描述来看,插值查找类似于平常查英文字典的方法。例如,在查一个以字母 D 开头的英文单词时,决不会用折半查找法。根据英文词典的查找顺序可知,D 开头的单词应该在字典较前的部分,因此可以从字典前部的某处开始查找。键值的索引计算,公式如下:
middle=left+(target-data[left])/(data[right]-data[left])*(right-left)参数说明:
例如,已经有排序好的数列: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 插补查找算法内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、折半查找算法折半查找算法又称为二分查找算法,折半查找算法是将数据分割成两等份,首先用键值(要查找的数据)与中间值进行比较。如果键值小于中间值,可确定要查找的
本文实例讲述了PHP有序表查找之插值查找算法。分享给大家供大家参考,具体如下:前言:在前面我们介绍了二分查找,但是我们考虑一下,为什么一定要折半呢?而不是折四分
本文实例讲述了JavaScript黑洞数字之运算路线查找算法。分享给大家供大家参考,具体如下:运行效果截图如下:具体代码如下:运算路线查找算法varBLACKH
Python寻找两个有序数组的中位数审题:1.找出意味着这是一个查找算法题2.算法复杂度log级别,就是提示你是二分查找3.二分查找实现一般为递归(1)递归包括
C++中二分查找递归非递归实现并分析二分查找在有序数列的查找过程中算法复杂度低,并且效率很高。因此较为受我们追捧。其实二分查找算法,是一个很经典的算法。但是呢,