数据结构之“树”——二叉树、红黑树、B树、B+树、B*树

news2024/10/5 18:24:17

这篇文章主要简单总结下二叉树、红黑树、B树、B+树、B*树的基本结构和原理。

一、二叉树

二叉树就是度不超过2的树(每个结点最多有两个子结点)。
二叉树是有序树(二叉排序树),若将其左右子树颠倒,则成为另一棵不同的二叉树。
二叉树的遍历有三种,分为前序、中序、后序(相对于根节点)。如图:
在这里插入图片描述

根节点-左节点-右节点
左节点-根节点-右节点
左节点-右节点-根节点

1、满二叉树

子节点全满。
在这里插入图片描述

2、完全二叉树

除最后一层外,所有层都是满节点,最后一层所有结点集中在最左边。满二叉树演变而来。
在这里插入图片描述

3、二叉查找树(二叉排序树)

最基础的二叉树是无序的,查询效率极低。排序之后的二叉树为二叉查找树,也是二叉排序树。
二叉查找树:左子树上的节点都小于根节点,右子树上所有节点的值都大于根节点。左、右子树也分别为二叉排序树。
在这里插入图片描述

4、平衡二叉树(AVL树)

在二叉查找树中,任一节点对应的两棵子树的最大高度差为 1,这样的二叉查找树称为平衡二叉树。其中左右子树的高度差也有个专业的叫法:平衡因子。左右节点都得为平衡二叉树。
在这里插入图片描述
平衡二叉树是采用二分查找法思维把数据按规则组装成一个树形结构的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度。

5、二叉树的左旋、右旋

左旋:是以节点的"右分支"为轴,进行逆时针旋转。
右旋:是以节点的“左分支"为轴,进行顺时针旋转。
在这里插入图片描述
为了达到平衡,二叉树会进行旋转操作。----一旦由于插入或删除导致左右子树的高度差大于1,此时就需要旋转某些节点调整树高度,使其再次达到平衡状态,这个过程称为旋转再平衡。

二、红黑树

红黑树也是一种特殊的二分查找树,但是红黑树是可以不让树频繁的去旋转平衡,归根结底就一句话:
最长子树只要不超过最短子树的两倍就OK,添加了变色的行为来保证树的平衡
具体要求如下:

①每个节点或者是黑色,或者是红色。
②根节点是黑色。
③每个叶子节点(NIL)是黑色。[注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点]
④如果一个节点是红色的,则它的子节点必须是黑色的。
⑤从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。[这里指到叶子节点的路径]

如图:
在这里插入图片描述
红黑树的插入操作如下:
首先是先插入;插入后,以刚插入的节点作为当前平衡节点N,进行平衡操作。
图解如下:
在这里插入图片描述

三、B树

B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用B树和B+树的数据结构。
B树属性如下:

每一个节点最多有 m 个子节点
每一个非叶子节点(除根节点)最少有 ⌈m/2⌉ 个子节点,⌈m/2⌉表示向上取整。
如果根节点不是叶子节点,那么它至少有两个子节点
有 k 个子节点的非叶子节点拥有 k − 1 个键
所有的叶子节点都在同一层

我们拿数据库索引来看,先看图:
在这里插入图片描述
这是典型的B树了,以查22为例,查询流程如下;
1、根节点查询,读入第一次内存(1次磁盘I/O);
2、区间为13-35,找到磁盘1的指针p2,可以找到磁盘3,读入第二次内存(2次磁盘I/O);
3、区间为20-33,找到磁盘3的指针p2,可以找到磁盘7,读入第三次内存(3次磁盘I/O);
4、在磁盘7中找到22。
大致流程如上,但是随之而来的缺点也很明显:
1、每个节点都存储data,磁盘大小有限,data大的话,会导致存储的数据有限。
2、数据数量比较多的时候,树的深度会变大,I/O次数会增加。

InnoDB 这种存储引擎默认情况下读的是 16kb,一共读取了三个磁盘块,意味着一共读取了 48k 的数据,假如说上面的这些 p 指针和 16 这些 key 值都不需要占用额外的存储空间,一条数据占用 1kb 的空间,那意味着当前节点里面最多存 16 条数据,下一个磁盘块也是 16 条,第三个磁盘块也是 16 条,计算一下的话是 16×16×16,也就是 4096 条数据。这个支撑的数据量也太少了。在生产环境中随便的一个 mysql 表都要上百万条,不可能是只有几万或者几千,这不太可能,这时候就要思考 b 树有什么问题了。

四、B+树

为了解决以上问题,引入了B+树。
在这里插入图片描述
如图所示,数据存储再叶子节点中,这样就不会造成存储空间有限的问题了。

读取的数据还是 16kb、16kb、16kb,假设,key 值加上 p 指针一共占用 10 个字节,那么 16kb 就是是 16×1000/10,得到结果为 1600,第二层也是 1600,第三层还是 16,所以最终的结果为 40960000 条数据,达到千万级别。而刚刚 B 树是 4096,完全不是一个量级。 因此,在三到四层的 B+树中,基本可以支持千万级别数据量的存储。

MySQL用的就是B+树。

五、B*树

是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针。
在这里插入图片描述

B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2);

B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;
B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针。

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

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

相关文章

MYSQL跨服务器访问数据库 :FEDERATED存储引擎

当想从不同服务器的数据库获取数据时,我们会想到oracle的DBLink;sqlserver的链接访问(傻瓜式操作,按照步骤配置即可),那么mysql有没有跨服务器访问的功能呢?答案自然是有的。 博主这就分享给大家…

语音识别-置信度

1.CONFIDENCE ESTIMATION FOR ATTENTION-BASED SEQUENCE-TO-SEQUENCE MODELS FOR SPEECH RECOGNITION : https://arxiv.org/pdf/2010.11428.pdf 1.引言 1).置信度的目的: 在半监督学习和主动学习中,选择较高置信度的数据来进一步提高ASR性能…

JVM学习04:类加载与字节码技术

JVM学习04:类加载与字节码技术 1、类文件结构 一个简单的 HelloWorld.java: //HelloWorld示例 public class HelloWorld {public static void main(String[] args) {System.out.println("hello world");} }执行javac -parameters -d . Hello…

生物识别技术是否会对安全产生挑战?

生物识别技术通过人体独特的生物特征来识别个人身份,包括指纹、虹膜、面部识别、声纹识别等技术。这些技术可以在安全领域得到广泛应用,例如入境控制、安全认证、金融交易等方面。但是,生物识别技术也可能带来安全挑战,具体如下: 数据泄露:生物识别技术需要收集个人生物特…

老杨说运维 | 如何成为卓有成效的管理者(关于AIOps的几点思考)

1966年,管理学领域被誉为“大师中的大师”的彼得德鲁克出版了日后被无数次再版的经典作品——《卓有成效的管理者》。 在书中他提到:管理者的使命就是“卓有成效”,但是卓有成效并非天分赋予,而是可以通过后天学习和实践获取的能力…

python 反编译

步骤1: (前置)下载pyinstxtractor.py ①将pyinstxtractor.py文件移动到想要解包的文件目录下 ②并在当前目录下输入cmd打开终端,执行>python pyinstxtractor.py 待反编译.exe eg:E:\my_decode>python pyinstxtractor.py …

单向散列函数——获取消息的 “指纹”

目录 什么是单向散列函数散列算法的特征散列算法的用途散列算法的分类密码学哈希和非密码学哈希不安全的密码学哈希算法主流的密码学哈希算法 SHA256散列算法(SHA2算法)SHA256算法过程SM3散列算法 应该使用哪种单向散列函数呢 什么是单向散列函数 单向散…

【920信号与系统笔记】第二章 连续时间系统的时域分析

连续时间系统的时域分析 2.1引言综述n阶线性系统1.数学模型2.解法古典解法近代时域法(卷积法、算子法) 叠加积分法1.本质2. 待解决问题 2.2系统方程的算子表示法算子及其运算规则1.微分算子和积分算子2.运算规则3.电容和电感的伏安特性 转移算子1.定义2.…

20230508MTCNN1

多目标检测思路 单目标检测:图片 输入到 模型,模型输出 4个值 为什么模型只能检测单个目标? 因为模型 固定输出4个值,表示 一个目标 如何实现多目标检测?思路:一个一个地数 模型要能够 认识目标&#xff…

LiangGaRy-学习笔记-Day12

1、作业回顾 1.1、判断磁盘利用率 要求: 判断磁盘的使用率,如果超过了90%就警告 [rootNode1 sh]# vim disk_check.sh #!/bin/bash #Author By LiangGaRy #2023年5月9日 #Usage:检测硬盘的使用率 ########################################### #定义一…

蓝奥声核心技术分享——用电插座的安全保护技术(安全计量插座)

1.技术背景 用电插座的安全保护技术主要针对在用电负载接入接出(即插拔)用电插座的过程,解决瞬态异常监控及安全保护问题。该项技术涉及物联网智能硬件设备与测控技术领域,尤其涉及电能信号监测与用电安全监控的技术领域。 随着…

【Redis高级应用】分布式缓存

文章目录 单机Redis存在的问题Redis持久化RDB持久化执行时机RDB原理 AOF持久化AOF原理AOF配置AOF文件重写 RDB与AOF对比 Redis主从搭建主从架构主从数据同步原理全量同步增量同步repl_backlog原理 主从同步优化小结 Redis哨兵哨兵原理集群结构和作用集群监控原理集群故障恢复原…

MySQL多列字段去重的案例实践

同事提了个需求,如下测试表,有code、cdate和ctotal三列, select * from tt;现在要得到code的唯一值,但同时带着cdate和ctotal两个字段。 提起"唯一值",想到的就是distinct。distinct关键字可以过滤多余的重…

Machine Learning-Ex8(吴恩达课后习题)Anomaly Detection and Recommender Systems

1. Anomaly detection 内容:使用高斯模型来检测数据集中异常的数据(概率低的),先在2维数据中进行实验。样本具有两个特征:a. 服务器响应的吞吐量(mb/s) b. 延迟(ms)。 …

【linux网络】正则表达式

一、正则表达式 1.1作用范围 通常用于判断语句中,用来检查某一个字符串是否满足某一格式 1.2正则表达式的组成 普通字符包括大小写字母、数字、标点符号及其它符号元字符元字符是指在正则表达式中具有特殊意思的专用字符,可以用来规定其导字符&#…

【P18】JMeter JSON JMESPath Extractor

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜: http://111.231.103.117/#/login 进入网页后,登录,页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12,打开调试工具,点击搜索 二、测试计划设…

Bean的存取、五大注解、对象的注入方式、Bean的作用域和生命周期

一、Bean 的创建、存储和使用 PS:Java语言中的对象也叫作 Bean。 1、创建一个maven项目 PS:要在 pom.xml 中添加 spring 框架支持 PS:引入 lombok 依赖(可以帮助实现 get 和 set 方法) 2、存对象 2.1、创建类 启…

Linux 蜂鸣器驱动实验

蜂鸣器驱动原理 ①、在设备树中添加 SNVS_TAMPER1 引脚的 pinctrl 信息。 ②、在设备树中创建蜂鸣器节点,在蜂鸣器节点中加入 GPIO 信息。 1、修改设备树文件 添加 pinctrl 节点 I.MX6U-ALPHA开发板上的BEEP使用了SNVS_TAMPER1这个PIN,打开imx6ull-alien…

【01】C++的第一个程序Hello World

C的第一个应用程序(Hello World程序) 引言一、代码二、代码解释三、注意事项总结 引言 💡 作者简介:专注于C/C高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。 👉 &#x1f39…

报表生成工具Stimulsoft Reports.JS如何减少产品脚本的加载时间

Stimulsoft Reports 是一款报告编写器,主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署,如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等,在你的应用程序中嵌入报告设计器…