Python - 深夜数据结构与算法之 AVL 树 红黑树
目录
一.引言
二.高级树的简介
1.树
2.二叉树
3.二叉搜索树
4.平衡二叉树
三.AVL 树
◆ 插入节点
◆ 左旋
◆ 右旋
◆ 左右旋
◆ 右左旋
◆ 一般形式
◆ 实际操作
◆ 总结
四.红黑树
◆ 概念
◆ 示例
◆ 对比
五.总结
一.引言
前面我们介绍了二叉树、二叉搜索树、多叉树等基础的树形结构,本文扩展一些新的树类型,例如 AVL 树、红黑树、B 树等等,完善一下整个框架内树的的概念。
二.高级树的简介
1.树

树,这里就不多重复了,包括根节点、左右子节点,分为多个层级的扩散的结构,因为其树形的结构天然的适合使用递归的方法进行遍历与处理。
2.二叉树

只有左右分叉的树即为二叉树, 二叉树主要掌握其三种遍历方式。
- 前序 Pre-order 根-左-右
- 中序 In-Order 左-根-右
- 后序 Post-Order 左-右-根

3.二叉搜索树

通过对数据进行有序编排,二叉搜索树将 o(n) 的搜索复杂度缩减为 o(log2n),其特点:
左子树所有节点小于根节点
右子树所有节点大于根节点

需要注意,二叉搜索树的中序遍历是升序排列。
◆ 节点查找

只需要与根节点比较即可,小于根节点到左子树,大于2根节点到右子树。 可以看到其查询的时间复杂度就是树的深度即 Level。
◆ 极端情况

当我们构建二叉搜索树时不注意树的结构或者平衡时,其容易出现如上图所示的极端情况,此时二叉树退化为链表,其搜索复杂度也恢复至 o(n)。
4.平衡二叉树

上面这种情况,最简单的平衡方法就是从中间把棍子打断,然后对于左右的棍子依次打断,直到平衡,但是实际情况下我们不会等树发展到这种棍子的状态才进行调整,我们一般在每一步插入元素的时候都会查看当前树是否平衡,并对其进行平衡化的操作。下面我们就了解几种常见的平衡二叉树。
三.AVL 树

AVL 树命名来源于其发明者,其在树中引入了平衡因子即 Balance Factor,该因子的计算为 左子树高度 - 右子树高度 或者 右子树高度 - 左子树高度,因此其值的范围控制在 -1、0、1。这里是高度而不是节点数的原因是二叉树的搜索时间复杂度与其深度即 Level 有关,而不是节点个数 (考虑棍子的极端情况)。当检测到数非平衡时,其会通过四种旋转操作使树达到平衡。

以上面的二叉树为例,每一个节点的平衡因子都基于其左右子树的深度差计算,以 J 为例,右子树深度即 Level 为 4,而左子树的深度为 3,从而其值 = 4 - 3 = 1。 而所有叶子节点左右子树都为 0,所以其值为 0。上面这个树的平衡因子范围在 [-1, 1],因而其是一颗严格意义上平衡的AVL 树,因此保持一个树的平衡因子在 [-1,1] 范围内,其就是一颗平衡二叉搜索树。
◆ 插入节点

14 增加后平衡因子在 [-1,1] 范围内,因此无需调整。

3 增加后根节点与第一个左节点的平衡因子变为 -2,此时平衡树被打破,需要使用旋转操作进行 reblance,共有四种旋转方式:
◆ 左旋

右右子树的情况,需要进行一次左旋调整为 AVL树。 A < B < C,所以 A B C 有效。
◆ 右旋

左左子树的情况下,依次右旋调整为 AVL 树。 A > B > C,所以 C B A 有效。
◆ 左右旋

左右子树即先一个单独左,再一个单独右,此时满足 A > B && C > B && A > C,结合在一起就是 A > C > B,所以可以先左旋 BC 并调换位置调整为 A > C > B 的左左子树,再右旋得到 B C A。

◆ 右左旋

B > A,B > C,C > A => B > C > A,所以可以切换为右右子树 A C B,再一次左旋即可。
◆ 一般形式

上面介绍了单节点的四种旋转方式,实际场景带子树的情况比较多,上面是几种通用的旋转方法。 我们再从头捋一遍 AVL 树,首先树的查询是基于其深度 Level 来的,所以通过引入平衡因子就能够获得高度差从而衡量一个树是否平衡,当超过1不平衡时,我们可以通过旋转进行 rebalance,此时从单节点推广至多节点,AVL 树的情况大致就这样。
◆ 实际操作
下面基于真实的二叉搜索树进行旋转操作。
- 左左子树

红框所在部分为左左子树,根据一般形式,我们需要把 Pivot = 5 提上去,再把 10 放下来,同时 Pivot 的 Right 挂到 root = 10 的 Left,就得到下面的结果,没理解的同学看一般形式再对应一下:

- 右左子树

红框部分为右左子树,参考上面一般方法, 进行右左旋,先将 15 换到 16,再把 16 改为 15.right,最后把 15 拿上去,9 改为 15.left 即可。

◆ 总结

AVL 树在满足平衡二叉搜索的情况下,每个 Node 都多余存储了一个平衡节点,因此其会有额外的存储负担,其次对于节点的增删,很容易使其成为非平衡的状态,从而频繁引发调整。
四.红黑树
◆ 概念
上面的 AVL 树通过平衡因子维持整个搜索树的平衡,但是由于其因子范围太小 [-1,1] 导致这里调整的频率太高,从而影响了查询的效率,所以为了折中就推出了一些近似平衡二叉树,红黑树就是其中的代表。其允许左右子树之间的高度差在两倍以内,放宽了范围从而较少了调整的次数。

◆ 示例

上面提到五条性质,前三条比较 common,主要看后两条:
- 不能有相临接的两个红色节点
- 任一节点到其每个叶子的所有路径都包含相同数目的黑色节点
Most Important:
从根到叶子的最长的可能路径不多于最短路径的两倍长。
◆ 对比

- AVL 树相比红黑树提供更快的查询效率,因为其更严格的平衡
- 红黑树提供了更快的插入和移除效率,因为 AVL 涉及到过多的旋转调整
- AVL 存储更多,因为其需要 int 存储节点平衡度,而红黑树只需要 bit 存储红或蓝即 0 或 1
- 读多写少适合使用 AVL 树,而工程中二者兼顾,所以红黑树的使用更加普遍例如 map/multimap
五.总结
截止到目前,一些基础的搜索结构与算法我们也了解差不多了,从最基本的树形结构,到并查集、Trie 树、二叉树、完全二叉树、平衡树等等。由于 AVL 树和红黑树的实现相对复杂,所以我们主要掌握其思想以及对应的几种旋转操作即可,做到能够看懂说清。
相关文章:
Python - 深夜数据结构与算法之 AVL 树 红黑树
目录 一.引言 二.高级树的简介 1.树 2.二叉树 3.二叉搜索树 4.平衡二叉树 三.AVL 树 ◆ 插入节点 ◆ 左旋 ◆ 右旋 ◆ 左右旋 ◆ 右左旋 ◆ 一般形式 ◆ 实际操作 ◆ 总结 四.红黑树 ◆ 概念 ◆ 示例 ◆ 对比 五.总结 一.引言 前面我们介绍了二叉树、二叉…...
Zookeeper使用详解
介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布…...
C#属性(Property)
文章目录 一、C#属性(Property)?二、属性的用法总结 一、C#属性(Property)? C#属性(Property)是一种访问器(accessor),用于封装一个类的字段&…...
在docker中搭建部署clickhouse
因需要给网关日志拉取并存储供数据分析师分析,由于几十个项目的网关请求数量很大,放在mysql不合适,MongoDB不适合分析,于是准备存放在clickhouse,clickhouse对于读写支持也比较友好,说干就干 1、在服务器中…...
第九部分 使用函数 (三)
目录 一、文件名操作函数 1、dir 2、notdir 3、suffix 4、basename 5、addsuffix 6、addprefix 7、join 一、文件名操作函数 下面我们要介绍的函数主要是处理文件名的。每个函数的参数字符串都会被当做一个或是 一系列的文件名来对待。 1、dir $(dir <names..>…...
基础命令继续
1:创建目录命令 mkdir命令 注意:创建文件夹需要修改权限,请确保操作均在HOME目录内,不要在Home外操作,涉及到权限问题,HOME外无法识别 小结: 练习: 2:touch创建文件 2:c…...
uni-app做A-Z排序通讯录、索引列表
上图是效果图,三个问题 访问电话通讯录,拿数据拿到用户的联系人数组对象,之后根据A-Z排序根据字母索引快速搜索 首先说数据怎么拿 - 社区有指导https://ask.dcloud.net.cn/question/64117 uniapp 调取通讯录 // #ifdef APP-PLUSplus.contac…...
Codeforces Round 768 (Div. 1) D. Flipping Range(思维题 等价类性质 dp)
题目 思路来源 官方题解 洛谷题解 题解 可操作的最短区间长度肯定是gcd,记为g,然后考虑如何dp 考虑g个等价类,每个等价类i,ig,i2*g,... 每次翻转长度为g的区间,会同时影响到g个等价类总的翻转的奇偶性, 性质一&…...
springboot集成kafka消费数据
springboot集成kafka消费数据 文章目录 springboot集成kafka消费数据1.引入pom依赖2.添加配置文件2.1.添加KafkaConsumerConfig.java2.2.添加KafkaIotCustomProperties.java2.3.添加application.yml配置 3.消费者代码 1.引入pom依赖 <dependency><groupId>org.spri…...
单例模式---JAVA
目录 “饿汉”模式 完整代码 “懒汉”模式 完整代码 单例模式:保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例。 单例模式可以通过实例创建的时间来分为两种:“饿汉”和“懒汉”模式。 “饿汉”模式 所谓的“饿汉”模式实则就是在类…...
maven管理使用
maven基本使用 一、简介二、配置文件三、项目结构maven基本标签实践(例子) 四、pom插件配置五、热部署六、maven 外部手动加载jar打包方式Maven上传私服或者本地 一、简介 基于Ant 的构建工具,Ant 有的功能Maven 都有,额外添加了其他功能.本地仓库:计算机中一个文件夹,自己定义…...
如何在一个系统中同时访问异构的多种数据库
如何在一个系统中同时访问异构的多种数据库 比如在一个系统中,要同时访问MySQL,H2, MsAccess, Mongodb. 要是使用Hibernate, MyBatis这些ORM,难度简直不敢想像。 要是MySQL还使用了分库分表,那更加不得了,一大堆的组件都要配合着…...
半监督学习 - 半监督聚类(Semi-Supervised Clustering)
什么是机器学习 半监督聚类是一种集成了有标签数据和无标签数据的聚类方法,其目标是在聚类的过程中利用有标签数据的信息来提高聚类性能。在半监督聚类中,一部分数据集有已知的标签,而另一部分没有标签。 以下是半监督聚类的基本思想和一些…...
实现STM32烧写程序-(3) Hex文件结构
简介 要对STM32进行更新动作, 就需要对程序文件进行解析, 大部分编译的生成程序文件是Hex或者Bin, 先来看看Hex的结构吧。 资料 Hex文件 简介 Hex文件格式最早由Intel公司于1973年创建。它最初是为了在Intel 8080微处理器上存储和传输二进制数据而设计的。随后,Hex…...
精品量化公式——“区域突破”,应对当下行情较好的主图看盘策略
不多说,直接上效果如图: ► 日线表现 代码评估 技术指标代码评估: VAR1, VAR2, VAR3:这些变量是通过指数移动平均(EMA)计算得出的。EMA是一种常用的技术分析工具,用于平滑价格数据并减少市场“…...
自然语言处理5——发掘隐藏规律 - Python中的关联规则挖掘
目录 写在开头1. 了解关联规则挖掘的概念和实际应用1.1 关联规则挖掘在市场分析和购物篮分析中的应用1.2 关联规则的定义和基本原理1.3 应用场景2. 使用Apriori算法和FP-growth算法进行关联规则挖掘2.1 Apriori算法的工作原理和实现步骤2.2 FP-growth算法的优势和使用方法2.3 A…...
【记录】重装系统后的软件安装
考完研重装了系统,安装软件乱七八糟,用到什么装什么。在这里记录一套标准操作,备用。一个个装还是很麻烦,我为什么不直接写个脚本直接下载安装包呢?奥,原来是我太菜了还不会写脚本啊!先记着吧&a…...
Android 13 - Media框架(31)- ACodec(七)
之前的章节中我们解了 input buffer 是如何传递给 OMX 的,以及Output buffer 是如何分配并且注册给 OMX 的。这一节我们就来看ACodec是如何处理OMX的Callback的。 1、OMXNodeInstance Callback 这一节我们只大致记录Callback是如何传递给ACodec的。在之前的学习中我…...
快速了解VR全景拍摄技术运用在旅游景区的优势
豆腐脑加了糖、烤红薯加了勺,就连索菲亚大教堂前都有了“人造月亮”,在这个冬季,“尔滨”把各地游客宠上了天。面对更多的游客无法实地游玩,哈尔滨冰雪世界再添新玩法,借助VR全景拍摄技术对冬季经典冰雪体验项目进行全…...
分布形态的度量_峰度系数的探讨
集中趋势和离散程度是数据分布的两个重要特征,但要全面了解数据分布的特点,还应掌握数据分布的形态。 描述数据分布形态的度量有偏度系数和峰度系数, 其中偏度系数描述数据的对称性,峰度系数描述与正态分布的偏离程度。 峰度系数反映分布峰的尖峭程度的重要指标. 当…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

