数据结构(7):查找

news2024/12/23 9:34:12

1 查找的基本概念

概念

常见操作

评价指标

平均查找长度!!!!

✖前面表示长度 后边表示个数!

处于的是总共的紫色的个数

总结

2 顺序查找、折半查找、分块查找

2.1 顺序查找

适用于线性表!

正常代码

哨兵!代码

查找效率分析

成功的话是 求的平均值

失败的话就是 查找到0都没有对应相等的,所以就是查找了n+1次!

顺序查找的优化(对有序表)

有序表:查找表中的元素有序存放(递增/递减!)

写出查找判定树 写出失败的那些框!

注意最后的两个n

有查找判别数分析ASL

顺序查找的优化2(被查概率不相等)

把概率大的放前面!

总结

时间复杂度都是o(n)

2.2 折半查找

实现思想

适用于 有序的顺序表!就是 二分法!

mid的值算出来如果是小数 就向下取整!

查找成功

在右边的时候更新时:low = mid+1

在左边的时候 high = mid-1

low = mid+1

这个时候high = low,如果所指和目标相等则查找结束!

查找失败

全面的都一样 到到low=high时,

mid = low = hight 此时mid的小于 目标值 一次low = mid+1

这是会出现low>height的矛盾 所以!算法结束! 

代码实现

这个判断逻辑是按照 元素是升序排列的!降序类似但不一样哦 注意辨别!

查找效率分析【具体计算】

关键词对比!--擦护照效率

折半查找的判定树【时间复杂度】

用到的结论

左子树的结点个数一定小于等于右!!!

右子树比左子树只可能多一个结点!!!!!!

所以这种就不可能存在

折半查找的判定树 一定是平衡二叉树!

树高公式和完全二叉树的计算方法一样

h=\left \lceil log_2(n+1)) \right \rceil向上取整!

 

失败结点的个数等于总结点+1
时间复杂度

总结

思考:

大多时候是高的但不是全部

2.3 分块查找

算法思想

low和high表示这个块的起始位置和结束位置!

例子

查找成功

查找失败

算法过程

在分块内顺序查找!

找在那个块是也可折半查找
eg1 :当目标在索引表关键字里时

eg2:当目标不在索引表关键字里时

最后会出现low>hight的结果折半查找结束,这是目标可能在 low所指的分块内!

low指向的比目标更大!!!!

上一步时low=high;这是如果所指关键字a<目标b: low = mid+1 这是low所指的关键字就比目标大了,所以在这个分块 // 如果所指关键字a>目标b:hight = mid-1  这时hight所指的块都比目标小 所以目标只能在low分块  

综上所述,一定在low分块里!!!

eg3:找不到分块low

特例的查找效率分析(ASL)

1、顺序查找

7有两次:对比10 对比7 然后结束yigongliangc

13有三次: 对比10 对比20 然后进去 对比13 结束 一共3次!

2、折半查找

27:一定不是2!!!远远不够!!!很庞大的工程

查找失败更复杂!!!

通项的查找效率

顺序查找

求ASL最小的时候!!!

什么时候ASL最小呢?当分块有\sqrt{n}个,每个分块有\sqrt{n}个,可以得出此时的ASL等于\sqrt{n}+1

这与顺序查找的ASL相比已经好特别特别多了,

直接所有元素顺序查找ASL=\frac{1+2+3+4+...+n}{n} = \frac{\frac{n(n+1))}{2}}{n} = \frac{n+1}{2} 当n = 10000时平均ASL是5000!

折半查找【有个小印象就可以了!】

总结

思考

插入一个元素8会导致所有的元素向后移动!代价太大 所以可以用链式存储!

数据结构应该怎末设计?因该采取什么样的查找算法 都是需要大家按照现实遇到的需求做下的决定!!!

3 树形查找

3.1 二叉排序树(BST)【缩写注意!】

定义

中序遍历就是 左中右!可以写出递增的序列!

查找代码

普通代码

成功:

失败:

T = T->rchild会等于NULL 这是这个循环就结束了 返回NULL

加入递归代码

两个代码的空间复杂度

递归要使用函数调用栈 需要的大小 是树的高度!

插入

当T为NULL时说明找到了 应该插入的位置!

一定注意这个数BSTree是引用类型的!!!!

构造二叉排序树

删除
1、删除叶子结点

2、只有一个左子树或右子树

删完连起来就行

3、既有左子树又有右子树

!!!详情见 数据结构(5):树和二叉树-CSDN博客 中的6.2

50 的直接后驱是60 这个60肯定是右子树总最小的结点 而且一定没有左子树(因为一旦有左子树说明还有一个比它小!)

让60代替50 然后删除60 这个结点 因为原60 是在最左下的所以没有左子树,回到第二种情况了,删了之后连起来就行!

当有直接前驱也是一样的:直接前驱说明是左子树中最大的,一定没有右子树,替代50后还满足二叉排序树的原则,删原来的30 后 后面右子树的话直接连上即可没有就算了

查找效率分析

查找长度

对比:就意味着一次循环或者递归

查找成功

对比的次数不会超过二叉树的高度!

所以

的效率是最高的

查找失败

失败的时候空时不要对比的,只有和关键字比较的时候 加查找长度!!!!!

总结

3.2 平衡二叉树(AVL!)

上面的排序树的时候 知道越胖胖的效率越高 而平衡二叉树就是胖胖的!!!

平衡二叉树(AVL定义)

左右子树高度差不超过1!!

当保证是平衡二叉树是,二叉排序树的查找效率可以达到

插入

关键是如何插入一个结点 还能保持平衡!

调整的对象是“最小不平衡子树!”

如何调整最小不平衡子树

1、LL

三个子树高度一定全是H

这样才能保证LL插入后A变成 最小 不平衡 子树!why?可以假设:

AR是H+1时 LL插入 A 的左右子树 只差1还是平衡;AR是H-1 A就不平衡了直接

当BR=H+1时 A 直接就是不平衡的;当BR=H-1时,LL插入后 BL和BR相差2 则里插入点最近的不平衡点B就变成了最小不平衡子树 !!不是A了

调整目标

解决方法:右旋

2、RR
解决方法:左旋

12 代码

gf意思就是与前面连起来的那些树!

顺序:爹的左/后 孩子的左/右 孩子变爹!

3、LR
解决办法:左旋+右旋

4、RL
方法:右旋+左旋

汇总

练习:

1、

2、

3、

查找效率
递推公式!!!

得到最少的结点 并且左右节点高度相差1

平均查找长度(ASL)

插入总结

删除

步骤

二叉排序树的删除满足了条件1!!!

例题
eg1 不需要调整

eg2 

检查上面的结点是否因为这个而产生了不平衡的现象!!!

eg3

eg4 不平衡向上传导

eg5 删除时按照二叉排序

直接前驱和后继

前驱:从左孩子的右边一路向下!

删除之后:

删除总结:

3.3 红黑树(RBT)【no代码】(搜搜23年咋考的)

为什莫出现?

都在使用红黑树!!!!

所以重点就是定义、性质、手算插入!

定义

红黑树是二叉排序树!

5个要求

增加父节点指针!

顺口溜:

左<根<右

根叶黑:根节点和叶子结点是黑色的!

不红红:不存在相邻的红色结点!

黑路同:(一条路走到黑)从同一个顶点到任何一个叶子结点的过程中 路过的黑结点的个数相同!

例子:

叶子节点是失败的那种节点

出题思路:

黑高

根节点黑高是2

与“黑高”相关的推论:

满树--黑路通;所以最小的情况就是全黑的满二叉树!

就可以证明下方的性质2:

性质!!!!!!!!!![一定注意这个!]

2、

n个关键字!

红黑树的查找效率不会超过红黑树的高度 所以反映了

时间复杂度

查找

插入!!

AVL(平衡二叉树的插入!)

找到位置---最小平衡子树---旋转--使其重新平衡

策略:

父亲的兄弟就是叔叔!

旋转是一样的!

插入的非根结点染红是为了满足 黑路同 这个特性!

动谁染谁 往相反的方向染!

会破坏的只有“不红红”!!!

。。。。。。

。。。。

最后的结果:

插入总结:

红黑树对于左右子树的要求没有那麽严格!

删除

我真服了啊啊啊啊啊啊啊!没事哒没事哒没事哒!

时间复杂度!O(log_2(n))

 3.4 B树

人如其名......

查找例子1【成功】

“走左边!”的感觉

当叉数比较多的时候!

查找例子2【失败】

如何保证查找效率

策略:

根节点是例外!!!!

策略2:

B树定义【满足两个策略】

高度都相同就是绝对的平衡。。。。

失败的结点还是叫叶子节点!

核心性质!!!!【选择】:

B树高度:

排除叶子节点!

最小高度:

最大高度:

高度越大说明 每个结点半酣的关键字和分叉尽可能的小

下边这个好理解一点哦

总结:

插入的时候根节点全凭运气,所以不一定整整好在那个范围里!

B树的插入:

一直插插插到超过时进行:

在这个基础上插一定插到最底层:

再插插插超过的话:

中间的那个元素插入到父节点里!

再插插插:

提出去的那个元素应该插入父节点的位置是 箭头链的那个位置!

再插插插:

父节点!超过!!

总结插入:

B树删除:

再非终端节点:

最左子树最右下的就是直接前驱,用这个替代!

把删除非终端转换成删除终端!

也可以使用直接后继:

用82顶替77

再删:

删38 之后低于下限了

兄弟够借的时候:

只有这样才能表示才能保证B树的特性不变(就是那个大小顺序!)

再删:

删90的时候

再删:

兄弟不宽裕 就两个人合体 删49

当兄弟没钱的时候总结:

插入和删除总结:

3.5 B+树【概念性的】

和分块查找很类似

保存每一层最大的关键字!

满足的条件

2)当根节点不是叶子的时候,那么他至少有 m/2 向上取整棵 子树!

3)第3个和B树是很不一样的,容易出选择题:再B树中 两个关键字就会有3个分支!而在B+树中分支【子树】树和关键字的个数相同!

4)叶子结点包含所有的关键字!!!还有指向记录的指针

B+树的查找

从根节点逐层向下

必须到最下面才查找结束!!!

但是B树就不用查找到最后一层!!

顺序查找

B树 vs B+树

不要求的内容:

只有放进内存里才有会进行读!

一个一个结点都存储在磁盘里,当这个关键字不存储对应的存储地址时,他的size就更小更方便,那么就会有更多的数据存储在磁盘里!

这就是B+和B最本质的区别!

总结:

4 散列查找

4.1 定义

4.2 处理冲突的方法-拉链法

小优化:

查找

对比关键词的次数才算到查找长度里!

平均查找长度ASL

成功:

失败:

装填因子

装的满不满的指标!

4.3 常见的散列函数【让冲突尽量减小提高查找效率!】

与质数相对的概念式合数!质数的因子只有1和自己

为什么一定要是质数?!

直接定址法:

不连续的话空位就很多

数字分析法:

平方取中法:

用空间换时间的算法

4.4 处理冲突方法2--开放定址法

线性探测法:

就是一个一个向后找直到有空的位置!

注意一个小细节!!!:

查找

同义词和非同义词都有可能发生冲突!!! 68 不是27的同义词但也被扫描了

这里的空位置算作一次比较次数,但是在处理冲突的方法1-拉链法里没有把与空算作一次对比,是因为那里的空位置存储的是一个空指针 不算;这里的空位置可以视为存储的是相同的数据类型的东西,因此算作一次次数!

删除

删除是要特别注意,要不然删了之后空了下次查找的时候就以为没有了,比如这个

解决方法:

删除的元素做一个标记 可以是一个bool型的变量 这样就可以让指针继续向下走了

查找效率分析(ASL):

成功:

就一个一个算.......

失败:

为什么?

同义词和非同义词堆积!

平方探测法

查找也是按照这个散列的序列

非重点小坑【探测到所有位置!】:

伪随机序列法

总结

开放定址法删除结点时要特别注意哦!!!

4.5 处理冲突法3-再散列法

王道上可能是错了

4.6 大总结:

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

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

相关文章

Java类和对象引入

目录 1.类与对象引入 2.类与对象关系示意图 3.类与对象的区别和联系 4.属性/成员变量 基本介绍 注意事项和细节说明 5.如何创建对象 先声明再创建 直接创建 6.如何访问属性 基本语法 7.类和对象的内存分配机制&#xff08;重要&#xff09; 案例演示&#xff…

string类的模拟实现(C++)

一、前言 想要模拟实现一个库中的类&#xff0c;那就要首先要熟悉如何使用这个类。建议通过下面博客&#xff0c;完成对Cstring类的学习。 C的string类-CSDN博客 二、模拟实现 我们将从string的成员函数即成员变量入手&#xff0c;模拟实现string类。 成员变量 string类的…

Spring Boot项目实现调用腾讯云进行人脸识别

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 背景 随着科技的不断发展&#xff0c;人脸识别技术已经成为了一种日益重要的身份验证和安全监控手段。腾讯云人脸识别功能便是其中之一&#xff0c;而Java语言又是现在最为常用且高效的编程语言之一。本篇论…

mongoDB 的安装和使用【docker compose,springboot】

一 介绍 NoSQL数据库 NoSQL&#xff1a;Not Only SQL ,本质也是一种数据库的技术&#xff0c;相对于传统数据库技术&#xff0c;它不会遵循一些约束&#xff0c;比如&#xff1a;sql标准、ACID属性&#xff0c;表结构等。 Nosql优点 l 满足对数据库的高并发读写 l 对海量数…

思维+dfs,CF 269C - Flawed Flow

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 269C - Flawed Flow 二、解题报告 1、思路分析 考虑源点相连的边的方向是确定的&#xff0c;因为流量是从源点往外流的 我们设cap[u] 为 和u相连边的容量和&#xff0c;显然入边容量要和出边容量相等&…

6.C基础_输入输出函数

putchar 功能&#xff1a;输出一个字符 函数声明&#xff1a; int putchar(int c);返回值&#xff1a;参数c的ASCLL码值 c&#xff1a;要输出的字符&#xff0c;可以为字符常量、字符变量或表达式 注意点&#xff1a;输出的结果不带\n getchar 功能&#xff1a;从键盘读…

Day28 | 56. 合并区间 738.单调递增的数字 968.监控二叉树

语言 Java 56. 合并区间 合并区间 题目 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 思路 创建…

基于单片机的ELF可执行文件加载以及Bootloader程序实现程序切换

目录 1.ELF可执行文件加载 1.1 ELF文件分类 1.2 ELF文件格式 1.3链接地址 ​编辑 2.Bootloader程序切换 2.1 Bootloader介绍 2.2 代码实现 1.ELF可执行文件加载 ELF&#xff08;Executable and Linkable Format&#xff09;文件是一种标准的文件格式&#xff0c;用于可…

秒懂Linux之编写小程序——进度条

目录 一.前文摘要 二.进度条编写 三全部代码&#xff08;非Linux环境下测试&#xff09; 一.前文摘要 在开始编写之前我们先来学习一些后面会用到的知识点~ 测试结果发现&#xff0c;Sleep无作用&#xff0c;编译完会立刻打印~ 再来看另一个测试~我们同样没有换行&#xff0c…

前后端中的日期格式转换问题

从前端接收到的日期转为想要的格式 JSON日期的反序列化为java对象时 JsonFormat(timezone “GMT8”, pattern “yyyy-MM-dd HH:mm:ss”) 从后端发送的日期转为想要的格式给前端 Java对象中的日期的序列化为JSON时会用到 Date数据序列化为JSON发往前端时&#xff0c;按以下格…

【机器学习西瓜书学习笔记——支持向量机】

机器学习西瓜书学习笔记【第六章】 第六章 支持向量机6.1 间隔与支持向量硬间隔最大化 6.2 对偶问题6.3核函数定义构建核函数应用优劣优势劣势 6.4 软间隔与正则化软间隔正则化 6.5支持向量回归&#xff08;SVR&#xff09;函数间隔和几何间隔SVR的原理SVR数学模型线性硬间隔SV…

The dependencies of some of the beans in the application context form a cycle

你们好&#xff0c;我是金金金。 场景 启动服务时&#xff0c;报错&#xff1a;应用程序上下文中的某些bean的依赖关系形成了一个循环 循环依赖 依赖循环指的是两个或多个类之间相互依赖的情况&#xff0c;即类A依赖类B&#xff0c;同时类B也依赖类A。 这种情况会导致编译器无…

java接口只能定义抽象方法吗?

写在前面 在Java中接口时作为规范来存在的&#xff0c;那么除了抽象方法&#xff0c;接口中还能定义其他方法吗?比如静态方法&#xff1f;本文一起来看下。 1&#xff1a;正文 这并不是一个绝对的是和否的问题&#xff0c;不同的jdk版本表现不同&#xff0c;在<1.7的版本…

用例管理框架

用例管理框架之pytest单元测试框架&#xff08;上&#xff09; 一、pytest用例管理框架&#xff08;单元测试框架&#xff09; 1.分类&#xff1a; python&#xff1a;unittest&#xff0c;pytest 必须非常熟练 2.主要作用&#xff1a; 发现测试用例&#xff1a;从多个py文…

深入理解 C 语言中的联合体

目录 引言 一、 联合体的定义与基本用法 1.联合体的定义 2.基本用法 二、 联合体与结构体的区别 1.结构体 2.联合体 3.对比 ​编辑三、联合体的优势 1. 节省内存 2. 提高效率 3. 代码简洁性 四、联合体的存储细节 1.内存对齐 2.大小计算 五、联合体的高级用法…

Windows内核态开发笔记

文章目录 r3/r0通信x64 HOOK回调监控进程强杀minifilterObRegisterCallbacksWFP后记 r3/r0通信 用户态 #include <Windows.h> #include <stdio.h>#define SENDSTR CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) void main() {HANDLE …

Reader

FileInputStream和FileOutputStream其实还叫字节输入流和字节输出流。关于输入和输出这2个总是有点模糊。 以内存为基准&#xff0c;InputStream是文件流向内存&#xff0c;就是从文件中读取数据&#xff0c;又称为输入流。 OutputStream是从内存中流向文件&#xff0c;就是向…

使用s3cmd 2.x 与 Cyberduck 管理在 DigitalOcean Spaces 对象存储中的数据

有很多用户在使用 DigitalOcean Spaces 对象存储的过程中&#xff0c;还没有找到一个合适的数据管理工具。其实目前有很多开源工具都可以使用&#xff0c;比如 s3cmd、Cyberduck、rclone、transmit5。Cyberduck 提供了直观的图形用户界面&#xff0c;而 s3cmd 2.x 则擅长于批处…

怎么搭建AI带货直播间生成虚拟主播?

随着电商直播带货的热潮不断升温&#xff0c;虚拟主播逐渐崭露头角&#xff0c;成为电商直播领域的新宠&#xff0c;相较于真人主播&#xff0c;虚拟主播具备无档期风险、人设稳定可控、24小时不间断直播等显著优势。 本文将深入探讨如何搭建一个AI带货直播间&#xff0c;并详…

最新小猫咪PHP加密系统源码V1.4_本地API接口_带后台

简介&#xff1a; 最新小猫咪PHP加密系统源码V1.4_完全本地化加密API接口_带后台 小猫咪PHP加密系统历时半年&#xff0c;它再一次迎来更新&#xff0c;更新加密算法&#xff08;这应该是最后一次更新加密算法了&#xff0c;以后主要更新都在框架功能上面了&#xff09;&…