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

这篇文章主要简单总结下二叉树、红黑树、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的数据到新结点,最后在父结点增加新结点的指针。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

php+vue+mysql医院医护人员医生排班系统

本医护人员排班系统管理员,医护。管理员功能有个人中心,医院信息管理,医护信息管理,医护类型管理,排班信息管理,排班类型管理,科室信息管理,投诉信息管理。医护人员可以修改自己的个…

「二线豪华」或成历史,理想反超沃尔沃再树「里程碑」

今年的上海车展,除了占据C位的新能源汽车,还有传统车企。 上海车展开幕前,沃尔沃汽车大中华区销售公司总裁钦培吉在新车发布会上直言:“新势力会的,我们三年就学会了;我们会的,新势力十年都学不…

Android安装apk出现 “安装包无效”或“安装包不兼容”的解决方案

Android 安装apk出现“安装包无效”或“安装包不兼容”解决方案 1. 问题出现2. 配置 build.gradle3. 生成Signed APK 1. 问题出现 使用Android Studio安装apk到手机一切正常,但是分享出去出现安装apk出现“安装包无效”或“安装包不兼容”问题 这种情况需要我们设…

4 IK分词器

4 IK分词器 4.1测试分词器 在添加文档时会进行分词,索引中存放的就是一个一个的词(term),当你去搜索时就是拿关键字去匹配词,最终 找到词关联的文档。 测试当前索引库使用的分词器: post 发送&#xff…

【分布式理论】聊一下 ACID、BASE、CAP、FLP

分布式理论基础 今天我们来聊一下分布式相关基础理论基础,上一篇文章中,我描述了一下分布式系统的纲,但是想要入手学习分布式系统设计,其实需要先从基本理论开始。而知名的ACID、BASE、CAP、FLP都是相关的理论基础。 ACID ACID…

六、FM1288调试方案-调试过程及细节

本篇文章,主要讲述实际调试操作:具体到需要调节哪些寄存器,调节完后,会有什么样的变化。但是整体效果不能达到我们期望的绝对感觉,所以我先把我们调试的结果放在前面,如果觉得不理想,也可以不看后面的内容了。 文章目录 1. 调试准备1.1 建立与FM1288芯片通信1.2 Uart结…

什么是多相流?在熟悉工业中常见的两相及多相流的分类及特点

文章目录 一、多相流的概览1.相的概念 二、多相流的引入单相流与多相流: 三、多相流及特性介绍四、常见的多相流的分类及特点1、常见的两相及多相流3、两相流动力学的发展简史4、两相流的研究方法和理论模型 一、多相流的概览 1.相的概念 物理学: 自然界中物质的态…

基于simulink使用麦克风阵列的声波束成形

一、前言 此示例演示如何对麦克风阵列接收到的信号进行波束化,以在嘈杂环境中提取所需的语音信号。 二、模型的结构 该模型模拟在 10 元件均匀线性麦克风阵列 (ULA) 上接收来自不同方向的三个音频信号。在接收器处添加热噪声后,应…

智慧厕所引导系统的应用

智慧公厕引导系统是一种基于智能化技术的公厕管理系统,可以为如厕者提供更加便捷、舒适、安全的如厕环境和服务,同时也可以引导如厕者文明如厕,营造文明公厕的氛围。智慧公厕引导系统可以通过智能引导屏、手机小程序等方式,为如厕…

【存储数据恢复】NetApp存储WAFL文件系统数据恢复案例

存储数据恢复环境: NetApp存储设备,WAFL文件系统,底层是由多块硬盘组建的raid磁盘阵列。 存储故障: 工作人员误操作导致NetApp存储内部分重要数据被删除。 存储数据恢复过程: 1、将存储设备的所有磁盘编号后取出&…

Linux上Nacos基本使用:连接MySQL并修改密码、启动、停止命令等

Nacos如何连接MySQL并修改密码 说明如何将内嵌数据库Derby切换为MySQL数据库直接新建MySQL数据库: 必须是MySQL5.7及以上 如何修改密码启动、停止命令 说明 nacos默认: 使用内嵌的数据库(Derby)默认登录地址 ip:8848/nacos; 账号&#xff1…

React 组件

文章目录 React 组件复合组件 React 组件 本节将讨论如何使用组件使得我们的应用更容易来管理。 接下来我们封装一个输出 “Hello World&#xff01;” 的组件&#xff0c;组件名为 HelloMessage&#xff1a; React 实例 <!DOCTYPE html> <html> <head> &…

JVM系列-第7章-对象的实例化内存布局与访问定位

对象的实例化内存布局与访问定位 对象的实例化 大厂面试题 美团&#xff1a; 对象在JVM中是怎么存储的&#xff1f;对象头信息里面有哪些东西&#xff1f; 蚂蚁金服&#xff1a; 二面&#xff1a;java对象头里有什么 对象创建的方式 new&#xff1a;最常见的方式、单例…

系统分析师之系统设计(十五)

目录 一、软件流程设计 1.1 业务流程分析方法 1.2 业务流程建模 1.2.1 标杆瞄准 1.2.2 IDEF 1.2.3 DEMO 1.2.4 流程建模语言 1.2.5 基于服务的BPM 1.2.6 业务流程重组BPR 1.2.7 业务流程管理BPM 二、软件架构设计 2.1 概念 2.2 软件架构风格 三、 结构化设计 四…

为什么停更ROS2机器人课程-2023-

机器人工匠阿杰肺腑之言&#xff1a; 我放弃了ROS2课程 真正的危机不是同行竞争&#xff0c;比如教育从业者相互竞争不会催生ChatGPT…… 技术变革的突破式发展通常是新势力带来的而非传统行业的升级改革。 2013年也就是10年前在当时主流视频网站开启分享&#xff1a; 比如 …

Vulfocus-struts2初了解

CVE-2013-2135 漏洞原理&#xff1a; 配置了通配符*&#xff0c;访问name.action时使用name.jsp来渲染页面&#xff0c;但是在提取name解析时&#xff0c;对其执行了OGNL表达式解析&#xff0c;所以导致了命令执行。如果一个请求与任何其他定义的操作不匹配&#xff0c;它将匹…

AMB300系列母线槽红外测温解决方案某锂电厂房项目案例分享

安科瑞 耿敏花 一、 行业背景 近年来&#xff0c;在国家政策引导与技术革新驱动的双重作用下&#xff0c;锂电产业保持快速增长态势&#xff0c;产业规模持续扩大&#xff0c;同时新能源产业工厂锂电池生产线对于电的依赖性很高&#xff0c;因而对供电设备的可靠性提出…

stable diffusion模型讲解

AI模型最新展现出的图像生成能力远远超出人们的预期&#xff0c;直接根据文字描述就能创造出具有惊人视觉效果的图像&#xff0c;其背后的运行机制显得十分神秘与神奇&#xff0c;但确实影响了人类创造艺术的方式。 AI模型最新展现出的图像生成能力远远超出人们的预期&#xf…

JAVA代码规范审查

JAVA代码规范审查 1. 添加必要的注释 所有的类都必须添加创建者和创建日期&#xff0c;以及简单的注释描述 方法内部的复杂业务逻辑或者算法&#xff0c;需要添加清楚的注释 一般情况下&#xff0c;注释描述类、方法、变量的作用 任何需要提醒的警告或TODO&#xff0c;也要注…

从 0~1 创建 Vue2 项目

前言 从0开始搭建Vue2项目&#xff1b;介绍项目目录结构&#xff1b;为了项目方便需要添加的配置。创建 Vue2 项目共有两种方式&#xff1a; 手动选择&#xff1b;选择默认模式。 给孩子点点关注吧&#xff01;&#x1f62d; 一、环境准备 1.1 安装包管理工具 1.1.1 安装 …