PHP有序表查找之插值查找算法示例

一、概述

PHP有序表查找之插值查找算法是一种优化的二分查找算法,适用于数据分布较为均匀的数组。其原理是通过公式计算出待查找元素在有序表的位置估计值,从而可以缩小查找范围,提高查找效率。

二、算法思路

  1. 计算待查找元素在有序表中的位置估计值,公式如下:

$$mid=low+\frac{(key-a[low])*(high-low)}{(a[high]-a[low])}$$

其中,$low$ 为当前查找区间的起始位置,$high$ 为结束位置,$key$ 为待查找的元素,$a$ 数组为有序表。

  1. 通过估计值 $mid$ 可以得到一个缩小的查找范围,再进行二分搜索。如果查找成功,则返回该元素的位置,否则返回不存在的提示信息。

三、示例说明

以下是两种不同数据分布的示例。

  1. 假设有一个长度为 $10$ 的有序数组 $a$,数据分布如下所示,查找元素为 $5$:
index 0 1 2 3 4 5 6 7 8 9
value 1 3 5 7 9 11 13 15 17 19

按照插值查找算法的公式,可以得到 $5$ 在有序数组中的位置估计值 $mid$ 为:

$$mid=0+\frac{(5-1)*(9-0)}{(19-1)}=2.84$$

即可缩小查找范围 $low=0$,$high=9$,$mid=2$。接着进行二分查找,发现 $a[mid]<key$,则在 $mid+1$ 到 $high$ 的区间内继续查找。最终找到了 $key=5$,返回 $2$。

  1. 假设有一个长度为 $10$ 的有序数组 $a$,数据分布如下所示,查找元素为 $21$:
index 0 1 2 3 4 5 6 7 8 9
value 1 3 5 7 9 11 13 15 17 19

按照插值查找算法的公式,可以得到 $21$ 在有序数组中的位置估计值 $mid$ 为:

$$mid=0+\frac{(21-1)*(9-0)}{(19-1)}=9.37$$

即可缩小查找范围 $low=0$,$high=9$,$mid=9$。接着进行二分查找,发现 $a[mid]>key$,则在 $low$ 到 $mid-1$ 的区间内继续查找。最终没有找到 $key=21$,返回不存在的提示信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP有序表查找之插值查找算法示例 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 微信小程序与后台PHP交互的方法实例分析

    下面是关于“微信小程序与后台PHP交互的方法实例分析”的一些具体步骤和示例说明。 一、准备工作 在进行微信小程序与后台PHP交互之前,需要先进行一些准备工作。 准备好微信开发者工具,并创建一个小程序项目。 创建后台PHP程序,可以使用Laravel、CodeIgniter、Yii等常用框架进行开发,或者直接使用PHP语言开发。 在后台PHP程序中编写响应微信…

    PHP 2023年5月23日
    00
  • 浅谈PHP设计模式的备忘录模式

    简介: 备忘录模式,属于行为型的设计模式。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。备忘录模式顾名思义,就是存档功能,类似Git工具,每次提交都相当于一次备份。主要有一下角色构成Memento —— 负责存储 Originator 的 唯一内部状态 ,它可以包含: string,n…

    PHP 2023年4月18日
    00
  • 骁龙835怎么样?高通骁龙835亮点特性全面解析

    骁龙835怎么样?高通骁龙835亮点特性全面解析 骁龙835是什么? 骁龙835是高通公司于2017年推出的一款用于移动设备的SoC芯片,采用了10nm工艺制程,并且首次采用了Qualcomm Kryo 280 CPU,Adreno 540 GPU和Snapdragon X16 LTE modem等组件。 骁龙835的亮点特性 1. 更低的功耗和更高的性能 …

    PHP 2023年5月27日
    00
  • php随机抽奖实例分析

    下面是关于“PHP随机抽奖实例分析”的完整攻略,包括步骤、代码示例和注意事项等: 1. 确定随机抽奖奖项及概率 在进行随机抽奖之前,需要确定参与抽奖的奖项及其对应的概率。通常,我们会给不同的奖项赋予不同的概率,以保证公平性和悬念。 比如,我们设置了三个奖项:一等奖、二等奖和三等奖,并分别设置其中奖概率为10%、30%和60%。 2. 开始抽奖 在确定奖项及概…

    PHP 2023年5月23日
    00
  • 说明的比较细的php 正则学习实例

    下面是对于“说明的比较细的php正则学习实例”的完整攻略: 什么是正则表达式 正则表达式是一种用来描述字符模式的代码。在编程中,我们可以使用正则表达式来匹配、查找、替换特定的字符或字符序列。正则表达式非常强大,能够描述各种不同的模式以及规则。 正则表达式语法 下面是正则表达式的一些基本语法及其用法: . 匹配任意字符,除了换行符和其他控制字符。 [] 匹配方…

    PHP 2023年5月26日
    00
  • php文件上传 你真的掌握了吗

    下面就为你详细讲解“php文件上传 你真的掌握了吗”的完整攻略。 1. 为什么需要学习文件上传 文件上传是web开发中非常基础的一个功能,常用于网站上传头像、上传附件等操作。但是,文件上传有很多的安全隐患,如果不正确使用,会导致网站被黑客攻击。因此,学习文件上传的原理和安全措施对于web开发者来说非常重要,这有助于我们编写更加安全可靠的代码。 2. 文件上传…

    PHP 2023年5月26日
    00
  • php实现无限级分类实现代码(递归方法)

    下面我将为你详细讲解 PHP 实现无限级分类的递归方法: 概念简介 无限级分类是指一个分类下还有子分类,而这些子分类还可以再有子分类,从而形成类似树形结构的分类。 实现步骤 创建一个空数组,用来存储分类和子分类的关系。 从数据库中获取所有的分类,并存储到数组中。 接下来需要定义递归函数来实现无限级分类的功能。递归函数的基本思想是,每次处理当前分类的子分类,如…

    PHP 2023年5月27日
    00
  • php 类自动载入的方法

    PHP类自动载入是指,在使用PHP程序时,当需要调用某个类时,如果该类没有被引入,则会自动执行一个加载该类的函数,从而实现自动载入。常见的PHP类自动载入方法有三种: 1.函数式自动载入方法 这种方法是通过调用一个函数来实现载入类的过程。具体实现代码如下: function autoload($classname){ include($classname .…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部