首页 > 编程语言 >PHP 插值搜索(Interpolation Search)

PHP 插值搜索(Interpolation Search)

时间:2024-04-05 11:29:39浏览次数:12  
标签:Search arr 插值 lo pos hi 搜索 PHP Interpolation

        给定一个由 n 个均匀分布值 arr[] 组成的排序数组,编写一个函数来搜索数组中的特定元素 x。 
        线性搜索需要 O(n) 时间找到元素,跳转搜索需要 O(? n) 时间,二分搜索需要 O(log n) 时间。 插值搜索是对实例二分搜索的改进,其中排序数组中的值是均匀分布的。

        插值在一组离散的已知数据点的范围内构造新的数据点。二分查找总是到中间元素去检查。

        另一方面,插值搜索可以根据正在搜索的键的值去不同的位置。例如,如果键的值更接近最后一个元素,则插值搜索很可能从末尾侧开始搜索。为了找到要搜索的位置,它使用以下公式。 

// 公式的思想是
当要搜索的元素更接近arr[hi]时,返回较高的pos值。 
// 当接近 arr[lo] 时值更小
arr[] ==> 需要查找元素的数组
x ==> 要搜索的元素
lo ==> arr[] 中的起始索引
hi ==> arr[] 中的结束索引

        有许多不同的插值方法,其中一种称为线性插值。线性插值采用两个数据点,我们假设为 (x1,y1) 和 (x2,y2),公式为:在点 (x,y) 处。
        该算法的工作原理类似于我们在字典中搜索单词。插值搜索算法改进了二分搜索算法。查找值的公式为:K = 数据-低/高-低。
        K是一个常数,用于缩小搜索空间。在二分查找的情况下,该常数的值为:K=(low+high)/2。

pos 的公式可以推导如下:
        我们假设数组的元素是线性分布的,直线的一般方程:y = m*x + c,y 是数组中的值,x 是其索引。
现在将 lo、hi 和 x 的值代入方程:
arr[hi] = m*hi+c ----(1) 
arr[lo] = m*lo+c ----(2) 
x = m* pos + c ----(3) 
m = (arr[hi] - arr[lo] )/ (hi - lo)
从 (3) x - arr[lo] = m * (pos - lo) 减去 eqxn (2) lo) 
lo + (x - arr[lo])/m = pos 
pos = lo + (x - arr[lo]) *(hi - lo)/(arr[hi] - arr[lo])

算法
除了上面的划分逻辑之外,插值算法的其余部分是相同的。 
        步骤1:在循环中,使用探针位置公式计算“pos”的值。 
        步骤2:如果匹配,则返回该项的索引,并退出。 
        步骤3:如果该项小于arr[pos],则计算左子数组的探针位置。否则,在右侧子数组中计算相同的值。 
        步骤4:重复直到找到匹配项或子数组减少到零。

下面是算法的实现:

<?php
// PHP program to implement $erpolation search
// with recursion
 
// If x is present in arr[0..n-1], then returns
// index of it, else returns -1.
function interpolationSearch($arr, $lo, $hi, $x)
{
    // Since array is sorted, an element present
    // in array must be in range defined by corner
    if ($lo <= $hi && $x >= $arr[$lo] && $x <= $arr[$hi]) {
        // Probing the position with keeping
        // uniform distribution in mind.
        $pos = (int)($lo
                     + (((double)($hi - $lo)
                         / ($arr[$hi] - $arr[$lo]))
                        * ($x - $arr[$lo])));
 
        // Condition of target found
        if ($arr[$pos] == $x)
            return $pos;
 
        // If x is larger, x is in right sub array
        if ($arr[$pos] < $x)
            return interpolationSearch($arr, $pos + 1, $hi,
                                       $x);
 
        // If x is smaller, x is in left sub array
        if ($arr[$pos] > $x)
            return interpolationSearch($arr, $lo, $pos - 1,
                                       $x);
    }
    return -1;
}
 
// Driver Code
// Array of items on which search will
// be conducted.
$arr = array(10, 12, 13, 16, 18, 19, 20, 21, 22, 23, 24, 33,
             35, 42, 47);
$n = sizeof($arr);
 
$x = 47; // Element to be searched
$index = interpolationSearch($arr, 0, $n - 1, $x);
 
// If element was found
if ($index != -1)
    echo "Element found at index ".$index;
else
    echo "Element not found.";
return 0;
#This code is contributed by Susobhan Akhuli
?> 

输出
在索引 4 处找到的元素
时间复杂度:平均情况为O(log 2 (log 2 n)),最坏情况为 O(n) 
辅助空间复杂度: O(1) 

标签:Search,arr,插值,lo,pos,hi,搜索,PHP,Interpolation
From: https://blog.csdn.net/hefeng_aspnet/article/details/137070118

相关文章

  • 最新版两款不同版SEO超级外链工具PHP源码
    可根据个人感觉喜好自行任意选择不同版本使用(版V1或版V2)请将zip文件全部解压缩即可访问!源码全部开源,支持上传二级目录访问已更新增加大量高质量外链(若需要增加修改其他外链请打开txt文件)修复优化页面端代码界面布局:源码为自适应端,手机和电脑端都适配源码工具介绍外链......
  • 太强了!分布式Elasticsearch集群数据迁移企业案例
    太强了!分布式Elasticsearch集群数据迁移企业案例原创 林致远 Linux运维之旅 2024-04-0408:31 广东 1人听过Linux运维之旅专注分享运维实用技术,内容不限于Linux系统运维、自动化工具、监控工具、日志采集、容器技术、测试工具、python、GO等技术分享20篇原......
  • ElasticSearch 实战:ElasticSearch索引操作
    Elasticsearch实战:Elasticsearch索引操作在使用Elasticsearch进行数据管理时,索引操作是核心的一部分。本篇将详细介绍如何进行索引的创建、查看、更新(包括映射修改)、关闭与开启、删除等操作,以及如何进行索引模板设置以简化索引管理。**1.创建索引创建索引可以通过发......
  • Elasticsearch与Clickhouse的对比分析
    ClickHouse和Elasticsearch是两种不同的数据存储和分析工具,各自在不同的用例和场景下发挥着作用。数据类型:ClickHouse:主要用于结构化数据,特别擅长处理大规模的数据仓库和分析场景,支持SQL查询。Elasticsearch:适用于非结构化或半结构化数据,特别擅长全文搜索和日志分析,支......
  • ctfshow web入门 php特性 web89--web107
    web89看到有intval函数这里建议先观看一篇博客好绕过https://blog.csdn.net/wangyuxiang946/article/details/131156104?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171220387216800197044297%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%......
  • 最新社交相亲系统源码PHP
    最新社交相亲系统源码PHP安装环境:php7.2mysql5.7框架:后端thinkphp6前端:jquerylayuiPC移动端响应式线上案例:https://cjr.oemsun.com/主要页面及功能预览首页相亲资料详情页红娘跟进记录海报、一键复制分享img条件搜索红线互换微信动态发......
  • php实现动态网站静态化
    用PHP实现:将动态网站整个网站静态化时用到(不光可以静态化PHP的网站,其他语言的也可以)1、站点目录下创建index.php文件:<?php//站点域名Sta::srart("https://域名");classSta{publicstatic$domain='';publicstaticfunctionsrart($domain){......
  • wamp/xammp医院预约挂号病历管理系统PHP+vue_snsj0
     医院病历管理系统主要有管理员,用户和医生三个功能模块。以下将对这三个功能的作用进行详细的剖析。本论文将对医院病历管理系统相关的技术以及网站开发技术进行分析和研究,在深入了解医院病历管理的过程以及合格要求后,结合用户的实际情况,研究医院病历管理系统的设计与实现,期望......
  • PHP代码审计——Day 5-postcard
    漏洞解析classMailer{privatefunctionsanitize($email){if(!filter_var($email,FILTER_VALIDATE_EMAIL)){return'';}returnescapeshellarg($email);}publicfunctionsend($data){if(!isset($data['to'])......
  • PHP代码审计——Day 4-False Beard
    漏洞解析classLogin{publicfunction__construct($user,$pass){$this->loginViaXml($user,$pass);}publicfunctionloginViaXml($user,$pass){if(//防止输入的参数含有<和>符号(!strpos($user,'<')||!strpos($user,'&......