数据结构—静态查找

简介

1. 数据的组织和查找是大多数应用程序的核心

2. 线性表、树、图是数据的组织结构

3. 查找是所有数据处理中最基本、最常用的操作

4. 当在一个庞大数量的数据集合中查找时,查找方法和效率就显得格外重要

查找介绍

1. 查找包含四种操作:查询、检索、插入、删除

查询,元素是否存在

检索,找到某个元素,访问元素的属性

插入,若元素不存在则插入

删除,若元素存在则删除

2. 静态查找表:包含前两种查询和检索操作,查找操作不影响原有数据集合

3. 查找的术语

查找表,同一类型元素构成的集合。集合是一个松散灵活的数据结构

关键字,是数据元素中某个数据项的值,用以标识一个数据元素,分主关键字(唯一标识),次关键字(部分识别)

查找,根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。

若查找成功返回位置或记录;查找不成功返回空指针或空记录

 

4. 衡量查找算法的标准

时间复杂度

空间复杂度

平均查找长度ASL,为确定记录在表中的位置所进行的和关键字比较的次数的平均值

          n为查找表的长度,即表中所含元素的个数

          Pi为查找第i个元素的概率(∑Pi=1)

          Ci是查找第i个元素时同给定值K比较的次数

顺序查找

 1. 顺序查找,是顺序表的查找方法,以顺序表或线性链表表示静态查找表。

①.从表中最后一个记录开始

②.逐个进行记录的关键字和给定值的比较

③.若某个记录比较相等,则查找成功

④.若直到第1个记录都比较不等,则查找不成功

 2. 实现代码

//顺序查找带哨兵
void search(int *a,int n)
{a[0]=n;for(int i=l;i>=0;i--){if(a[i]==n){if(i>0)cout<<i<<endl;elsecout<<"error"<<endl;break;}}
}

3. 顺序查找算法性能

对顺序表而言,Ci=n-i+1

在等概率查找的情况下,Pi=1/n

ASL=n*P1 +(n-1)P2 +…+ 2Pn-1+ Pn = (n+1)/2

4. 顺序查找算法优化

如果被查找的记录概率不等时,设

  Pn≥Pn-1≥···≥P2≥P1

记录按照概率来排列,这样使得ASL可以达到极小值

若查找概率无法事先测定,增加一个访问频度域存储访问频率,然后记录按照访问频率来排序

在每次查找之后,将刚刚查找到的记录直接移至表尾的位置上。

 5. 其他

        顺序查找算法优点:简单、适应面广(对表的结构无任何要求)

        顺序查找算法缺点:平均查找长度较大

        特别是当n很大时,顺序查找效率很低

 

折半查找

1. 折半查找算法是有序表的查找方法

在折半查找算法中,静态查找表按关键字大小的次序,有序地存放在顺序表中

2. 折半查找的原理是:

先确定待查记录所在的范围(前部分或后部分)

逐步缩小(一半)范围直到找(不)到该记录为止

3. 折半查找算法设计

1.n个对象从小到大存放在有序顺序表ST中,k为给定值

2.设low、high指向待查元素所在区间的下界、上界,即low=1, high=n

3.设mid指向待查区间的中点,即mid=(low+high)/2û

4.让k与mid指向的记录比较

  若k=ST[mid].key,查找成功

  若k<ST[mid].key,则high=mid-1  [上半区间]

  若k>ST[mid].key,则low=mid+1  [下半区间]

5.重复3,4操作,直至low>high时,查找失败。

4. 算法代码实现

//折半查找
void search(int *a,int n) {int left = 1;int right = l;while (left <= right) {int mid = (left + right) / 2;if (a[mid] < n)left = mid + 1;else if (a[mid] > n)right = mid - 1;else {cout << mid << endl;return;}}cout << "error" << endl;
}

5. 算法性能分析 

/*
折半查找算法性能分析设有序表的长度n=2h-1(即h=log2(n+1)),则描述折半查找的判定树是深度为h的满二叉树树中层次为1的结点有1个,层次为2的结点有2个,层次为h的结点有2h-1个假设表中每个记录的查找概率相等,则查找成功时折半查找的平均查找长度
𝐴𝑆𝐿_𝑏𝑠=1/𝑛 ∑_(𝑖=1)^𝑛▒𝐶_𝑖 =1/𝑛 [∑_(𝑗=1)^ℎ▒〖𝑗×2^(𝑗−1) 〗]=(𝑛+1)/𝑛  log_2⁡( 𝑛+1)−1
*/

6. 其他

折半查找算法优缺点

折半查找的效率比顺序查找高(特别是在静态查找表的长度很长时)

查找只能适用于有序表,并且以顺序存储结构存储。

折半查找前要先排序

 

索引顺序查找

1. 索引顺序查找,又称分块查找,是一种索引顺序表(分块有序表)查找方法,是折半查找和顺序查找的简单结合

要求顺序表是分块有序表,将整个表分成几块,块内无序,块间有序

所谓块间有序是指后一块表中所有记录的关键字均大于前一块表中的最大关键字

2. 索引顺序查找包含主表和索引表

主表:用数组存放待查记录,每个数据元素都含有关键字域

索引表:索引表是按关键字有序的,每个结点含有最大关键字域和指向本块第一个结点的指针

3. 索引顺序查找算法设计

用折半或顺序查找方法,在索引表中找到块

用顺序查找方法,在主表对应块中找到记录

4. 算法代码实现

//分块查找
void search()
{int n;cin >> n;int a[n];for (int i = 0; i < n; i++) {cin >> a[i];}int m;cin >> m;int max[m];int index[m + 1];for (int i = 0; i < m; i++) {cin >> max[i];}int x = n / m;index[0] = 0;for (int i = 1; i < m; i++) {index[i] = index[i - 1] + x;}index[m] = n ;int t;cin >> t;while (t--) {int k;cin >> k;int num = 0;int visit = 0;for (int i = 0; i < m; i++) {num++;if (k <= max[i]) {for (int j = index[i]; j < index[i + 1]; j++) {num++;if (k == a[j]) {visit = j;goto out;}}}}out:if (visit != 0) {cout << visit + 1 << "-" << num << endl;} else {cout << "error" << endl;}}
}

 5. 算法性能分析

/*
索引顺序查找算法性能
若将长度为n的表分成b块,每块含s个记录,表中每个记录查找概率相等
用折半查找方法在索引表中查找索引块ASL块间≈log2(n/s+1)
用顺序查找方法在主表对应块中查找记录,ASL块内=(s+1)/2
ASL分块查找=log2(n/s+1)+(s+1)/2
索引顺序查找应用的隐含条件:主表数据要块间有序。如果主表完全无序,还是要用顺序查找。
*/

静态算法比较 

若将长度为n的表分成b块,每块含s个记录,表中每个记录查找概率相等

 

顺序查找

折半查找

分块查找

ASL

最大,(n+1)/2

最小,log2(n+1)-1

两者之间

表结构

有序表、无序表

有序表

分块有序表

存储结构

顺序存储结构

线性链表

顺序存储结构

顺序存储结构

线性链表

总结 

1. 查找的概念

包含四种操作:查询、检索、插入、删除

包含前两种操作的是静态查找,包含四种操作的是动态查找

评价查找算法的指标平均查找长度ASL

2. 静态查找表:顺序查找、折半查找、顺序索引查找,位置从1开始

3. 顺序查找:带哨兵的查找,从末尾往前找;可以是顺序表或链表

ASL=(n+1)/2,时间复杂度O(n),

4. 折半查找:又称二分查找,要求表有序且必须是顺序表

每次找中点比较,查找范围缩小一半

ASL=Log2(n+1)-1,时间复杂度O(log2n)

5. 顺序索引查找:又称分块查找,要求块间有序块内无序;可以是顺序表或链表

要求有索引表,对主表进行分块并建立索引

先用折半查找搜索索引表,再用顺序查找搜索块内

练习 

1. 一个有100个元素的线性表,若采用带哨兵的顺序查找某个元素,最少_____次比较,最多_____次比较

2. 已知顺序表{2,4,5,8,12,14,24,36,98},若采用二分查找,比较次数最多的元素是____;若查找元素24,经过比较的元素是____

3. 已知顺序表{102,114,105,218,202,243,318,306,384,352},如果按数据的百位数进行分块,采用索引顺序查找,则查找元素384,经过比较的元素是__________

 

 

 

 

 

 

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

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

相关文章

幻兽帕鲁社区服务器搭建架设开服教程(LINUX)

幻兽帕鲁社区服务器搭建架设开服教程&#xff08;LINUX&#xff09; 大家好我是艾西&#xff0c;上一期我给大家分享了windows系统版本的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对于服务器的配置有一定的要求很多小伙伴就思考用linux系统搭建的话占用会不会小一点&#x…

华为云CodeArts Snap荣获信通院优秀大模型案例及两项荣誉证书

2024年1月25日&#xff0c;中国人工智能产业发展联盟智能化软件工程工作组&#xff08;AI for Software Engineering&#xff0c;下文简称AI4SE&#xff09;在京召开首届“AI4SE创新巡航”活动。在活动上&#xff0c;华为云大模型辅助系统测试代码生成荣获“2023AI4SE银弹优秀案…

cortexM c语言和汇编嵌套编程

编程环境是:stm32cubeIde 原因:很多操作需要使用底层来做,比如中断时的上下文数据保存。也就是说用到汇编来实现。 疑问:c语言怎么才能跟汇编很好的兼容在一起呢?必将是我下一步的必经探索之路了。 一、C语言和汇编兼容格式 asm( 汇编字符串 : 输出约束字符串 …

C++哈希表map映射

开房门 时间限制&#xff1a;1.000S 空间限制&#xff1a;128MB 题目描述 假设你手里有一串钥匙&#xff0c;这串钥匙上每把钥匙都有一个编号&#xff0c;对应着一个房门的编号。现给你一个房门编号&#xff0c;你需要判断是否能够打开该房门。 输入描述 测试数据共有多组…

代码随想录算法训练营第二十四天| 77. 组合。

77. 组合 题目链接&#xff1a;组合 题目描述&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 解题思路&#xff1a; 本题是经典的回溯法解决的组合问题&#xff0c;回溯问题搞清楚纵向递归横向遍历即…

混乱字母排序——欧拉路数论

题目描述 小明接到一个神秘的任务&#xff1a;对于给定的 n 个没有顺序的字母对&#xff08;无序代表这两个字母可以前后顺序颠倒&#xff0c;区分大小写&#xff09;。请构造一个有 (n1) 个字母的混乱字符串使得每个字母对都在这个字符串中出现。 输入输出格式 输入格式 第…

KVM虚拟机MAC地址冲突,引发服务器对xshell说:Go away!

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 开场白 最近在机房的服务器上装kvm虚拟主机。 不经意间&#xff0c;上演了一场由MAC地址异常而引发的服务器与xshell之间的血案…

宠物商业数据分析

一、宠物热销品类分布 欧睿国际更有一份数据表明&#xff0c;宠物食品在所有“它经济”中占比是最大&#xff0c;仅仅是猫狗食品就达到了59.1%&#xff0c;增速也远高于其他宠物用品。 2018年&#xff0c;中国就已经有超7700万独居成年人口&#xff0c;国内养宠主力军中90后占…

c++阶梯之auto关键字与范围for

auto关键字&#xff08;c11&#xff09; 1. auto关键字的诞生背景 随着程序的逐渐复杂&#xff0c;程序代码中用到的类型也越来越复杂。譬如&#xff1a; 类型难以拼写&#xff1b;含义不明确容易出错。 比如下面一段代码&#xff1a; #include <string> #include &…

nginx无法启动,win10占用80端口 (注册表方式解决)

参考&#xff1a;https://blog.csdn.net/qq_39523111/article/details/128853509 改为4 重启后 不再占用 pid 不是4了 已经变为nginx了 改为0 没起作用 发现 80端口还是被 4占用 可以 把 服务中的 SQL Server Reporting Services关掉

使用深度学习框架飞浆Paddle实现的鲜花识别任务

PaddlePaddle&#xff08;飞桨&#xff09;是百度公司开发的深度学习框架&#xff0c;具有易用、高效、灵活和可伸缩等特点。以下是关于PaddlePaddle框架的详细介绍&#xff1a; 易用性&#xff1a;PaddlePaddle框架提供了Python作为主要的前端语言&#xff0c;并提供了丰富的…

2024年美赛B题思路分析 - 搜索潜水器

# 1 赛题 问题B&#xff1a;搜索潜水器 总部位于希腊的小型海上巡航潜艇&#xff08;MCMS&#xff09;公司&#xff0c;制造能够将人类运送到海洋最深处的潜水器。潜水器被移动到该位置&#xff0c;并不受主船的束缚。MCMS现在希望用他们的潜水器带游客在爱奥尼亚海底探险&…

【疑问】为什么声明和定义要分离

前言 我们在学习的时候接触过一个话&#xff1a;编写自定义函数的时候 要做到声明和定义分离 那么为什么呢 今天就来简单的了解一下 疑问&#xff1a;错误的发生 下面给出两个源文件和一个头文件以及报错信息 text.cc文件 #include"head.h"int main() {int a 1…

总是提示安装不了tensorflow

折腾了好久&#xff0c;不知道为啥装不上&#xff0c;我参考了链接大神链接 pypi.python.org在国内被墙了&#xff0c;无法从python官网url下载。 pip install xxx -i http://pypi.douban.com/simple --trusted-host pypi.douban.com pip3 install -i https://pypi.tuna.tsin…

Backtrader 文档学习- Analyzers - Analyzers Reference(上)

Backtrader 文档学习- Analyzers - Analyzers Reference&#xff08;上&#xff09; 1.Analyzers 对象 用于对照参考中涉及的方法和属性。 anal bt.analyzers str_attr for i in dir(anal) :if i[:1] ! _:str_attr i , print (str_attr) 属性方法&#xff1a…

Pytroch 自写训练模板适合入门版 包含十五种经典的自己复现的一维模型 1D CNN

训练模板 在毕业之前&#xff0c;决定整理一下手头的代码&#xff0c;自己做1D-CNN这吗久&#xff0c;打算开源一下自己使用的1D-CNN的代码&#xff0c;包括用随机数生成一个模拟的数据集&#xff0c;到自己写的一个比较好的适合入门的基础训练模板&#xff0c;以及自己复现的…

2020年CSP-J认证 CCF非专业级别软件能力认证第一轮真题--完善程序题

2020 CCF认证第一轮&#xff08;CSP-J&#xff09;真题 三、完善程序题 第一题 质因数分解 给出正整数n&#xff0c;请输出将n质因数分解的结果&#xff0c;结果从小 到大输出。 例如&#xff1a;输入n120程序应该输出2 2 2 3 5,表示1202 X 2 X 2 X 3 X 5输入保2≤n≤10^9提…

个人建站前端篇(二)项目采用服务端渲染SSR

SSR的优点 更好的SEO首屏加载速度更快&#xff0c;用户体验更好可以使用相同的语言以及相同的声明式、面向组件的心智模型来开发整个应用&#xff0c;而不需要在后端模板系统和前端框架之间来回切换。 Vue生态中的SSR通用解决方案 Nuxt是一个构建于 Vue 生态系统之上的全栈框…

springboot 整合 PowerJob实现定时任务调度

最近项目需要使用定时任务&#xff0c;而使用了PowerJob做任务调度模块&#xff0c;感觉这个框架真香&#xff0c;今天我们就来深入了解一下新一代的定时任务框架——PowerJob&#xff01; 简介 PowerJob是基于java开发的企业级的分布式任务调度平台&#xff0c;与xxl-job一样…

10个React状态管理库推荐

本文将为您推荐十款实用的React状态管理库&#xff0c;帮助您打造出高效、可维护的前端应用。让我们一起看看这些库的魅力所在&#xff01; 在前端开发中&#xff0c;状态管理是至关重要的一环。React作为一款流行的前端框架&#xff0c;其强大的状态管理功能备受开发者青睐。…