插值查找-有序表查找_20230411

插值查找-有序表查找

  1. 前言

有序表的查找一般分为二分查找(折半查找),斐波那契查找以及插值查找方法,前面我们讨论了斐波那契查找算法的具体实现,本文着手讨论插值查找算法。

插值查找只适用于关键字均匀分布的情况,在这种情况下,对于表厂较长的表,其查找的平均性能比折半查找要优异,如果关键字分布不均匀,其查找效率相对而言会很低,尤其是某个关键字很大,它对查找位置的影响就非常大,从而影响分割下标的移动速度。

插值查找也是利用分治的方法对表进行分割,与二分查找不同的地方在于,它不是对有序表进行均匀分割,而是按照关键字的大小进行比例分割。

  1. 具体算法

算法的核心思想是对分割查找点的计算,《数据结构》严蔚敏版本给出的定义是,
split=((key−st.elem[l].key)∗(h−l+1))/(st.elem[h].key−st.elem[l].key)split=((key – st.elem[l].key) * (h – l + 1))/ (st.elem[h].key – st.elem[l].key) split=((keyst.elem[l].key)(hl+1))/(st.elem[h].keyst.elem[l].key)
相当于把最大值和最小值进行等分,然后按照待查询关键字与最小关键字之间的间距,确认查询点距离low位置的长度。

由于有序表中可能存在相邻两个相等的元素或者low==high的情况,在这种情形之下,就需要特别处理,否则分母为零,计算会出现异常。

定义当st.elem[h].key== st.elem[l].key相等的时候,split=(l+m)/2的值取中间即可。通过定义函数,具体查找点的位置算法,

int find_interpolation_point(SSTable st, int key, int l, int h)
{if(EQ(st.elem[l].key,st.elem[h].key)){return (l+h)/2;}else{return (((key - st.elem[l].key) * (h - l + 1))/ (st.elem[h].key - st.elem[l].key));}
}
  1. 其它主要算法的实现

利用迭代或者递归的方式实现插值查找,首先采用迭代的方式进行查找,

int interpolation_search_iteration(SSTable st, KeyType key)
{int low;int high;int split;low=1;high=st.len;while(low<=high){split = find_interpolation_point(st, key, low, high) + low;if (EQ(key, st.elem[split].key)){return split;}else if (LT(key, st.elem[split].key)){high = split - 1;}else{low = split + 1;}}return 0;
}

特别值得一提的细节是,正常情况下split的查找点为:
split=find_interpolation_point(st,key,low,high)+low−1split = find \_\ interpolation\_point(st, key, low, high) + low-1 split=find_ interpolation_point(st,key,low,high)+low1
由于计算分割点的函数做了舍去处理,所以这里需要采用的计算方式:
split=find_interpolation_point(st,key,low,high)+low;split = find\_interpolation\_point(st, key, low, high) + low; split=find_interpolation_point(st,key,low,high)+low;
如果采用第一种方式,就会出现分割点小于最小值的情况,读者可以自行尝试。

我们也尝试采用递归的方式进行插值查找,其思路与迭代相同:


int interpolation_search_recursion(int low, int high, SSTable st, KeyType key)
{int split;int low_side;int high_side;if(low>high){return 0;}else{split = find_interpolation_point(st, key, low, high) + low;if (EQ(key, st.elem[split].key)){return split;}else if (LT(key, st.elem[split].key)){low_side = interpolation_search_recursion(low, split - 1, st, key);return low_side;}else{high_side = interpolation_search_recursion(split + 1, high, st, key);return high_side;}}}
  1. 算法分析

如果数值分布不均一,那么split的值移动的速度会非常慢,导致查询效率比二叉树低,算法时间复杂度过高。渎职可以分析有序数组arr[]={5,13,19,21,37,56,64,75,80,88,92,157,200,235,270}在利用插值查找88的时候出现的情况。

  1. 小结

通过本文分析,理解了插值查找的应用场景以及局限性,另外对于插值点查询函数做了些许优化,在遇到相邻数值相等的有序表中,采用中值替代插值点。

参考资料:

1.《数据结构(C语言版)》-严蔚敏,清华大学出版社

查看全文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/2284205.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章:

插值查找-有序表查找_20230411

插值查找-有序表查找
前言
有序表的查找一般分为二分查找(折半查找),斐波那契查找以及插值查找方法,前面我们讨论了斐波那契查找算法的具体实现,本文着手讨论插值查找算法。
插值查找只适用于关键字均匀分布的情况&……

保姆级教程–抢先体验 Microsoft 365 Copilot,微软全家桶Chat GPT

更多教程与资源详见wx供重浩:创享日记 前段时间微软发的Microsoft 365 Copilot 可以说非常火爆了,那么该怎么抢鲜体验呢。今天分享的操作,目前大家不用急着来,因为订阅365还是要花钱的,大家可以等到真正能用的时候再开……

【100%通过率 】【华为OD机试python】最大报酬【2022 Q4 A卷|100分】

华为OD机试- 题目列表 2023Q1 点这里!!
2023华为OD机试-刷题指南 点这里!! 题目描述 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作, 每项工作都有对应的耗时时间(单位h)和报酬, 工作的总报酬为所有已完成工作的报酬之和, 那么请你帮小明安排一下工作,……

【计算机网络】学习笔记:第一章 体系结构(四千字详细配图)【王道考研】

基于本人观看学习b站王道计算机网络课程所做的笔记和理解,进行交流分享 供参考 如果本篇笔记帮助到了你,还请点赞 关注 支持一下 ♡>𖥦<)!! 主页专栏有更多,如有疑问欢迎大家指正讨论,共同进步! 目录……

LeetCode 236. 二叉树的最近公共祖先 | C++语言版

LeetCode 236. 二叉树的最近公共祖先 | C语言版LeetCode 236. 二叉树的最近公共祖先题目描述解题思路思路一:使用递归代码实现运行结果参考文章:思路二:减少遍历节点数代码实现运行结果参考文章:LeetCode 236. 二叉树的最近公共祖……

LeetCode_101

内容提要 贪心算法
保证每次操作都属局部最优的,从而使得最后的结果是全局最优
全局结果是局部结果的简单求和,且局部结果互不相干
分配问题
分发饼干 455 简单
分发糖果 135 困难
先从左往右遍历一遍,如果右边孩子的评分比左边的高……

教你如何搭建物业-办公管理系统,demo可分享

1、简介
1.1、案例简介
本文将介绍,如何搭建物业-办公管理。
1.2、应用场景
该应用包含停车、收费、投诉、通知、访客等管理功能。
2、设置方法
2.1、表单搭建
1)新建表单【业主信息】,字段设置如下:
名称类型名称类型类型……

Spark学习——DataFrame清洗HDFS日志并存入Hive中

目录
1.开启Hadoop集群和Hive元数据、Hive远程连接
2.配置
3.读取日志文件并清洗
4.单独处理第四列的数据——方法一:
5.单独处理第四列的数据——方法二:
6.单独处理第四列的数据——方法三:
7.数据清洗结果展示
8.存入Hive中
9.……

C#中的文件操作大全

1.创建文件夹 //using System.IO; Directory.CreateDirectory(%%1); 2.创建文件 //using System.IO; File.Create(%%1); 3.删除文件 //using System.IO; File.Delete(%%1); 4.删除文件夹 //using System.IO; Directory.Delete(%%1); 5.删除一个目录下所有的文件夹 //using ……

c#数据库操作大全

1.提取单条记录 //using System.Data; //using System.Data.SqlClient; using (SqlConnection cn new SqlConnection(%%1)) //ConfigurationManager.ConnectionStrings["db2ConnectionString"].ConnectionString //Data SourcemyServerAddress;Initial CatalogmyDa……

cocos内存管理原理详解

转载自:COCOS学习笔记–Cocod2dx内存管理(三)-Coco2d-x内存运行原理_RapdoZoroの博客-CSDN博客_cocos2dx引擎内存管理工具
一、cocos2dx之如何优化内存使用(高级篇)_yixiao3660的专栏-CSDN博客
cocos2d中对于图片动画加载缓存的使用 – 简书……

cocos creator实战项目记录(一)

creator(一下简称ccc)貌似从16年发布到现在已经有五年了,当时我还是游戏开发菜鸟,不过当时我已经在从事cocos-js的工作,所以对ccc的发布还是比较关注。不过后来,阴差阳错的一直没有干ccc相关的项目&#xf……

cocos creator实战项目记录(二)—-屏幕适配

屏幕适配应该是很多游戏引擎都会有的东西;先发下我在之前博客汇中写关于屏幕适配的文章,cocos2d-x中的屏幕适配,这篇文章主要讲解了原来cocos2d-x(下文简称cc-2d)中的屏幕适配;对比现在的cocoscreator (以下简称ccc)&a……

k8s学习-CKS真题-K8S安全策略PodSecurityPolicy

目录题目环境搭建解题参考题目 Task 使用 Trivy 开源容器扫描器检测 namespace kamino 中 Pod 使用的具有严重漏洞的镜像。 查找具有 High 或 Critical 严重性漏洞的镜像,并删除使用这些镜像的 Pod。 注意:Trivy 仅安装在 cluster 的 master 节点上&……

STM32F103基于HAL库I2C/SPI硬件接口+DMA驱动 SSD1306 Oled

STM32F103基于HAL库I2C/SPI硬件接口DMA驱动 SSD1306 Oled✨由于手上只有I2C接口的SSD1306 OLED屏幕,仅测试了硬件I2C驱动显示功能,实际测试的FPS帧率在37或38变化。 📢本项目从Github开源项目中移植过来,开源地址:http……

English Learning – L2 第 14 次小组纠音 复习元音 [ɔɪ ] [aʊ] [əʊ] [ɪə] 弱读 2023.4.12 周三

English Learning – L2 第 14 次小组纠音 复习元音 [ɔɪ ] [aʊ] [əʊ] [ɪə] 弱读 2023.4.12 周三共性问题coin voice /kɔɪn/ /vɔɪs/ 中 ɔɪvowel pounds /ˈvaʊəl/ /paʊndz/ 中的 aʊshow /ʃəʊ/beer nearly /bɪə/ /ˈnɪəlɪ/ 中的 ɪəbest bed ten /best/……

LC-1157. 子数组中占绝大多数的元素(二分查找+随即猜,摩尔投票+线段树,upper_bound和lower_bound函数)

文章目录[1157. 子数组中占绝大多数的元素](https://leetcode.cn/problems/online-majority-element-in-subarray/)统计每个元素的索引-超时二分查找 随机猜摩尔投票 线段树[剑指 Offer 39. 数组中出现次数超过一半的数字](https://leetcode.cn/problems/shu-zu-zhong-chu-xi……

杭州旭航集团,申请纳斯达克IPO上市,募资9800万美元

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,为中国企业提供数字内容营销服务的杭州旭航网络科技有限公司的控股公司Xuhang Holdings Ltd(以下简称:旭航集团),近期已向美国证券交易委员会(SEC)提……

深度学习快速参考:11~13

原文:Deep Learning Quick Reference 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如何实现目……

基于copula的风光联合场景生成与缩减

目录
1 主要内容
风光出力场景生成方法
2 部分程序
3 程序结果
4 程序链接
点击直达! 1 主要内容
该程序方法复现《融合风光出力场景生成的多能互补微网系统优化配置》风光出力场景生成部分,目前大多数研究的是不计风光出力之间的相关性影响&amp……

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注