【数据结构】分块查找

分块查找(也称为索引顺序查找)是一种改进的顺序查找方法,它将查找表分成若干个块,并要求块内的元素有序排序,但块与块之间不要求有序。每个块内的最大元素构成一个索引表。分块查找的过程是先查找索引,确定待查元素所在的块,然后在该块内进行顺序查找。

分块查找的平均查找长度介于顺序查找和二分查找之间,适用于查找次数相对较少,而插入和删除操作频繁的线性表。

分块查找的步骤如下:

  1. 建立索引:首先将查找表分成若干个块,每个块内的元素不必有序,但块间必须是有序的,即第i块的每个元素都必须小于第i+1块的所有元素。

  2. 构建索引表:对于每个块,选择一个元素(通常是该块的最大值)放入索引表中。索引表是排序的。

  3. 查找过程

    • 首先在索引表中查找待查关键字所在的块,由于索引表是有序的,可以使用二分查找或顺序查找。
    • 确定了所在的块后,在相应的块内进行顺序查找。

分块查找的时间复杂度主要取决于两个部分:索引查找和块内查找。如果索引表使用二分查找,那么索引查找的时间复杂度为O(log m),其中m是块的个数。块内查找的时间复杂度为O(n/m),其中n是元素总数。因此,平均查找长度约为O(log m + n/m)。

分块查找的优点是插入和删除操作比较方便,只需要在块内进行,而不需要移动块外的元素。这使得分块查找在某些动态变化的数据库中比较适用。

1.索引表

typedef struct
{
        int max ; // 这块里的最大值是多少
        int post ; // 记录这块的起始下标
} index_t ;

2.源数据表

int a [ 19 ] = { 18 , 10 , 9 , 8 , 21 , 20 , 38 , 42 , 19 , 50 , 51 , 72 , 56 , 55 , 76 , 100 , 90 , 88 , 108 };
块间有序,块内无序
0 -- 3 18 , 10 , 9 , 8 // 0 18
4 -- 8 21 20 38 42 19 // 1 42
9 -- 13 50 , 51 , 72 , 56 , 55 // 2 72
14 - 18 76 , 100 , 90 , 88 , 108 // 3 108

3.示例代码

#include <stdio.h>
typedef struct
{int max;//每一块的最大值int post;//每一块的起始下标
}index_t;
int findByBlock(int* a, int n1, index_t* b, int n2, int x)
{int start,end;//用来保存块的起始和终止下标//1.先确定x可能在哪一块中int i;for(i = 0; i < n2; i++){if(x <= b[i].max)//说明可能在b[i]块中break;}if(i == n2)//说明没有执行过break,说明x,比最后一块的最大值还要大return -1;//没找到//2.锁定这一块的起始和终止下标,去源数据表中进行顺序查找start = b[i].post;if(i == n2-1)//说明在最后一块,最后一块没有后一块end = n1-1;//数组长度-1,就是最后一个有效元素下标elseend = b[i+1].post - 1; //后一块的起始下标-1 得到前一块的终止下标//取源数据表 在start --- end之间取查找for(i = start; i <= end; i++){if(x == a[i])return i;}return -1;//没有找到
}
int main(int argc, const char *argv[])
{//源数据表 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18int a[19] = { 18, 10, 9, 8, 21, 20, 38,42, 19, 50, 51, 72, 56, 55, 76,100,
90, 88, 108};//索引表index_t b[4] = {{18, 0},{42, 4},{72, 9},{108, 14}};//将数组中的每个元素都查找一遍int i;for(i = 0; i < 19; i++){printf("%d的位置下标%d\n",a[i], findByBlock(a, 19, b, 4, a[i]));}printf("%d的位置下标%d\n",66,findByBlock(a, 19, b, 4, 66));return 0;
}
结语
以上就是分块查找的使用方法,本次代码分享到此结束。
最后的最后,还请大家点点赞,点点关注,谢谢大家!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑洞路由、 DDoS 攻击 、 环路

黑洞路由 DDoS 攻击 DDoS 攻击是一种针对服务器、服务或网络的恶意行为。DDoS 攻击通过向目标发送大量流量&#xff0c;使其不堪重负&#xff0c;导致资源和带宽被耗尽。因此&#xff0c;目标可能会变慢或崩溃&#xff0c;无法正常处理合法的流量。DDoS 攻击通常是由僵尸网络…

在龙梦迷你电脑福珑2.0上使用Fedora 28 龙梦版

在龙梦迷你电脑福珑2.0上使用Fedora 28 龙梦版。这个版本的操作系统ISO文件是&#xff1a;Fedora28_for_loongson_MATE_Live_7.2.iso 。它在功能方面不错。能放音乐&#xff0c;能看cctv直播&#xff0c;有声音&#xff0c;能录屏&#xff0c;能在局域网里用PuTTY的ssh方式连接…

嵌入式学习——C语言基础——day5

1. 分支结构——switch 1.1 单层switch switch (整形表达式) { case 常量1:语句块1;break; case 常量2:语句块2;break; case 常量3:语句块3;break; default: 语句块4; } 注意&#xff1a; 1. 表达式必须…

《苏东坡 传》一蓑烟雨任平生

《苏东坡 传》一蓑烟雨任平生 林语堂&#xff0c;中国现代著名作家、学者、翻译家、语言学家。 张振玉 译 文章目录 《苏东坡 传》一蓑烟雨任平生[toc]摘录小结感悟 摘录 苏东坡是个秉性难改的乐天派&#xff0c;是悲天悯人的道德家&#xff0c;是黎民百姓的好朋友&#xff0c;…

C语言C/S架构PACS影像归档和通信系统源码 医院PACS系统源码

C语言C/&#xff33;架构PACS影像归档和通信系统源码 医院PACS系统源码 医院影像科PACS系统&#xff0c;意为影像归档和通信系统。它是应用在医院影像科室的系统&#xff0c;主要的任务是把日常产生的各种医学影像&#xff08;包括核磁、CT、超声、各种X光机、各种红外仪、显微…

JAVA ASM总结篇-03

MethodVisitor ClassVisitor的visitMethod能够访问到类中某个方法的一些入口信息&#xff0c;那么针对具体方法中字节码的访问是由MethodVisitor来进行的 访问顺序如下&#xff0c;其中visitCode和visitMaxs仅调用一次&#xff0c;标志方法字节码访问的开始和结束 MethodVisi…

不羁联盟怎么参与测试 不羁联盟测试时间+参与测试方法分享

不羁联盟怎么参与测试 不羁联盟测试时间参与测试方法分享 《不羁联盟》是由育碧&#xff08;Ubisoft&#xff09;开发的一款6v6团队合作射击游戏。游戏的背景设定在一个后启示录时代的废土世界中&#xff0c;玩家能够身临其境地感受到废土世界的荒凉和残酷。游戏在内测时候就受…

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台级联时,下级平台未发流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

AUTOCAD输出或打印PDF文件时,如何将图形居中且布满图纸?

AUTOCAD输出或打印PDF文件时,如何将图形居中且布满图纸? 如下图所示,我们打开一份DWG格式的图纸文件,然后点击上方的“打印“图标, 如下图所示, 打印机/绘图仪这里选择“DWG To PDF“; 图纸尺寸:这里以普通的A4纸为例进行说明; 打印比例选择“布满图纸“; 打印偏移…

优维应用级数字化架构管理:让企业运维天堑变通途

在优维科技的产品视角中&#xff0c;数字化架构管理就像是一门精妙的艺术&#xff0c;它将上层应用模型的业务概念以可视化的方式呈现出来&#xff0c;使得业务逻辑和流程变得更加直观、清晰。我们将这样的管理方式理解为“给企业搭起一座桥梁”——在这座桥梁的搭建过程中&…

express服务器 authorization 前端获取不到的问题

服务器生成token 设置在响应头&#xff0c;但是前端获取不到 const token JWT.generate({ id: new Date().getTime(), userName }, 10s) res.header(Authorization, token) axios.interceptors.response.use((response) > {console.log(response);if (response.data?.co…

破解费用管理迷局,企业费用管理从不止于报销

数字化变革浪潮下&#xff0c;各种企业费用报销软件如雨后春笋般不断涌现&#xff0c;企业报销效率大幅提升&#xff0c;部分财务处理流程得到固化和优化&#xff0c;报销早已不再是企业费时费力的财务难题。那么&#xff0c;企业费用管里如何实现呢&#xff1f; 企业费用贯穿于…

ubuntu上安装调试SVN服务

刚成立团队需要临时搭建一台SVN服务器&#xff0c;所以对照网上的一些提示做了下&#xff0c;操作起来不复杂&#xff0c;还是踩了不少坑&#xff0c;顺便原理性了解了下。 主要操作步骤如下&#xff1a; 1&#xff1a;安装svn sudo apt-get install subversion 2: 创建svn版…

NVIDIA智算中心“产品”上市,AI工业革命的iPhone时刻

GTC 2024落下帷幕了&#xff0c;但这个大会的信息仍在AI产业和经济中发酵。咨询机构WIKIBON认为&#xff0c;GTC 2024在整个科技史中的意义超过了当年史蒂夫乔布斯的iPod和iPhone发布。在AI将永久改变人类的共识下&#xff0c;GTC 2024在广度、愿景、生态系统等方面都有着深远影…

Nacos注册中心的使用

一&#xff1a;服务注册 步骤如下&#xff1a; 引入依赖 配置Nacos地址 重启 1、添加依赖 在需要注册的项目的pom.xml中添加依赖&#xff1a; <!--nacos 服务注册发现--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>s…

支付宝开发平台(官方)开发文档

支付宝开发平台官方开发文档地址&#xff1a; 支付宝开放平台文档中心 小程序&#xff1a;开发小程序&#xff0c;在支付宝客户端提供服务。 网页&移动应用&#xff1a;在移动应用和网站中集成支付宝服务端提供的各项能力。 生活号&#xff1a;开发生活号&#xff0c;在…

利用Python进行大规模数据处理【第173篇—数据处理】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 利用Python进行大规模数据处理&#xff1a;Hadoop与Spark的对比 随着数据量的不断增长&…

记一次linux内存不足导致java进程被kill掉

问题现象&#xff0c;服务器上的Java进程莫名奇妙没有了&#xff0c;没有留下任何日志信息&#xff0c;jvm异常崩溃日志也没有。设置异常日志打印也没有打出来 nohup java -jar -Dserver.port8080 $discovery$ip:$port $config$ip:$port -Dfile.encodingUTF-8 -Xms2048m -Xmx2…

ros仿真启动小龟

1.启动RosMaster&#xff08;管理Ros中各个节点的“大管家”&#xff0c;每次启动Ros时需要首先启动RosMaster&#xff09; roscorefangfang-inspiron-5580:~/ros2/download/rosdistro$ roscore ... logging to /home/fang/.ros/log/6ec2d790-fe1d-11ee-aba8-1c1bb5cdec7c/ros…

解决方案:Pandas如何多条件筛选数据

文章目录 一、现象二、解决方案 一、现象 用SQL多条件筛选数据&#xff0c;就是where 加上 and&#xff0c;来进行处理。 我平常用SQL处理数据这方面比较多&#xff0c;但用Pandas处理数据这方面比较少&#xff0c;所以一时犯了难&#xff0c;百度一下解决了&#xff0c;鉴于此…