我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python查找算法之插补查找算法的实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python查找算法之插补查找算法的实现

一、插补查找算法

插补查找算法又称为插值查找,它是折半查找算法的改进版。插补查找是按照数据的分布,利用公式预测键值所在的位置,快速缩小键值所在序列的范围,慢慢逼近,直到查找到数据为止。根据描述来看,插值查找类似于平常查英文字典的方法。例如,在查一个以字母 D 开头的英文单词时,决不会用折半查找法。根据英文词典的查找顺序可知,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 插补查找算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python查找算法之插补查找算法的实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python查找算法如何实现

本文小编为大家详细介绍“Python查找算法如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python查找算法如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。查找算法是用来检索序列数据(群体)中是
2023-06-30

详解Go语言实现线性查找算法和二分查找算法

线性查找又称顺序查找,它是查找算法中最简单的一种。二分查找,也称折半查找,相比于线性查找,它是一种效率较高的算法。本文将用Go语言实现这两个查找算法,需要的可以了解一下
2022-12-20

php如何实现查找算法

小编给大家分享一下php如何实现查找算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支
2023-06-14

python二分查找算法的递归实现方法

本文实例讲述了python二分查找算法的递归实现方法。分享给大家供大家参考,具体如下: 这里先提供一段二分查找的代码:def binarySearch(alist, item):first = 0last = len(alist)-1fou
2022-06-04

Python详细解析之二分查找算法

本篇文章给大家带来了关于python的相关知识,其中主要整理了二分查找算法的相关问题,包括了算法描述、算法分析、算法思路等等内容,下面一起来看一下,希望对大家有帮助。二分法是一种效率比较高的搜索方法回忆之前做过的猜数字的小游戏,预先给定一个小于100的正整数x,让你猜猜测过程中给予大小判断的提示,问你怎样快速地猜出来?我们之前做的游戏给定的是10次机会,如果我们学会.二分查找法以后,不管数字是多少,
2022-06-28

java算法之二分查找法的实例详解

java算法之二分查找法的实例详解原理假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1。通过数组长度可取出中间位置元素的索引,将其值与目标值比较,如果中间位置元素值大于目标值,则
2023-05-31

php二分查找算法怎么实现

PHP实现二分查找算法的步骤如下:确定要查找的数组和目标值。定义一个函数,传入查找的数组、目标值以及数组的起始位置和结束位置作为参数。在函数内部,计算数组的中间位置,并将中间位置的值与目标值进行比较。如果中间位置的值等于目标值,则直接
php二分查找算法怎么实现
2024-03-15

快速查找与二分查找算法如何在Java中实现

这期内容当中小编将会给大家带来有关快速查找与二分查找算法如何在Java中实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 快速查找:这个是相当简单的,以数组举例,就用一个for循环去查找数组中需要查
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录