漫谈红黑树:红黑树的奇妙演化

news2024/9/22 13:36:49

漫谈红黑树:红黑树的奇妙演化

  • 一、红黑树的提出
  • 二、红黑树性质的简单推导
  • 三、结论

博主简介


💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、协程、DPDK等。
👉
🎖️ CSDN实力新星、CSDN博客专家、华为云云享专家、阿里云专家博主
👉


一、红黑树的提出

追溯起来的话,红黑树的启蒙最早应该是由计算机科学家 Rudolf Bayer 和 Volker Weber 在 1972 年的一篇论文《Maintaining a Search Tree Under Dynamic Insertions and Deletions》引出的;他们的论文主要关注在外部存储器上维护平衡的二叉搜索树,用于数据库的索引结构。

但是,真正的红黑树数据结构应该是Leo J. Guibas和Robert Sedgewick在1978年发布的一篇《A dichromatic framework for balanced trees》论文提出的,该论文提出了一个用于平衡树算法实现和研究的统一框架。该框架只调用包含两个节点的二叉树,它允许每个节点有一个比特,称为节点的颜色来存储平衡信息。也就是红色和黑色。

在这里插入图片描述

这篇论文的作者讨论了与AVL树使用的单旋转和双旋转相同的方式改变树的结构。只是区别在于何时决定旋转和操作节点的颜色。

论文的第一部分主要介绍了常见的平衡树算法可以在O(logN)的时间复杂度内执行各种操作。然而,由于平衡树的种类繁多且缺乏性能分析结果,实际实现起来往往很麻烦。为了解决这个问题,作者提出了一个统一的框架,用于实现和研究平衡树算法。该框架仅处理包含两种类型节点(内部节点和外部节点)的二叉树,并使用每个节点的颜色来存储平衡信息。
在这里插入图片描述

在这里作者观察到了一些特性:

  • 用红色和黑色来储存平衡信息。也就是红黑树的性质之一:节点是红色或黑色。
  • 路径上的黑弧数将是相同的。也就是红黑树的性质之一:从任一节点到其每个叶子节点的简单路径上,所有黑色节点的数量相等。
  • 在任何路径上都不会出现两个连续的红色链接。也是红黑树的性质之一:红色节点的子节点必须是黑色,不能有两个连续的红色节点。
  • 外节点为黑色,内部节点可能是红色或黑色。也是红黑树的性质之一:叶子节点(NIL节点)是黑色。

在这里插入图片描述

作者还发现,每个AVL树都可以变为一棵2-3-4树:在二色表示法中,这可以非常简洁地描述。将节点的高度定义为从该节点到外部节点的最长路径的长度。要将一棵AVL树变成2-3-4树,只需将那些从偶数高度的节点到 奇数高度的节点的链接涂成红色即可。

第二部分使用二色框架进行平衡树算法分析。作者通过设计一个基于局部上下文的平衡器,实现了在不收集整个树的信息的情况下进行平衡操作。经过他们的仿真研究和实证观察,发现各种算法在平均情况下表现良好,并且对输入数据的敏感性较低。而且代码更简洁,只需要传统AVL代码的60%左右。
在这里插入图片描述

第三部分主要讨论了树的其他特性和相关算法。一种一次遍历的自顶向下删除算法,可以在一次遍历中完成删除操作。对算法的性能进行了比较分析。通过他们的实证观察和仿真研究,发现各种算法在平均情况下的性能差异很小。所以,作者建议在大多数应用中使用自顶向下算法,因为它们更简单。
在这里插入图片描述

由此可知,推荐使用红黑树的原因是即使在相同的效率下,它的实现更简单、内存占用更少。AVL的平衡条件太苛刻,左右子树的高度差不能超过1,否则就要出发复杂的rebalance操作,苛刻条件会导致开销不能功过相抵,在写操作频繁的操作中,AVL似乎并不能很好的适应。

二、红黑树性质的简单推导

根据《A dichromatic framework for balanced trees》论文第一部分的说明,我们可以适当的进行推导。红黑树并不是AVL这种顺应逻辑的条件,可以从红黑树的近亲 2-3树进行演示。

2-3树在插入过程中不断增长出新的根,使得树的高度不断增高,底层节点高度永远相等,忽略2节点和3节点的差异后会发现这是一颗完全二叉树,所有节点的高度都相等,是一颗完美的AVL树。

如果将其全部的3节点展开,展开时通过红色边链接展开后的子节点构造成一颗二叉树,比如:
在这里插入图片描述

把当前节点同父节点之间的边的颜色计作节点的颜色,可得:

在这里插入图片描述

这就是这颗2-3树唯一对应的红黑树,从展开前的情况可以知道,未展开红色节点前,所有节点的高度完全一致,展开红色节点后,忽略掉红色节点,所有节点的黑高就是完全一致的,这就是红黑二叉树的性质之一:从任一节点到其每个叶子节点的简单路径上,所有黑色节点的数量相等。

由展开过程和分配节点颜色可知只有父节点原来是3节点时,才会将一个父节点中的一个染色为红色,但是展开后,该红色父节点变成了2节点,不会对该节点进行展开操作,所以该节点的子节点一定是黑色,这也是红黑树的性质之一:红色节点的子节点必须是黑色,不能有两个连续的红色节点。

三、结论

(1)红黑树不是由 AVL演变来的,而是推导出来的。由Rudolf Bayer在1972年引入,然后由Leonidas J. Guibas和Robert Sedgewick在1978年进行了改进。红黑树放宽了平衡的要求,它要求每个节点具有颜色属性(红色或黑色),并通过一些约束来确保树的大致平衡。虽然红黑树的平衡性不如AVL树严格,但由于其相对较少的旋转操作,红黑树在实际应用中表现出更好的性能。

(2)红黑树没有像AVL一样严格的深度差要求,但是要求从任一节点到其每个叶子节点的简单路径上,所有黑色节点的数量相等。

(3)红黑树最开始被引入来解决在动态数据结构中需要保持平衡的问题。它的设计目标是在维护二叉搜索树的基本性质的同时,尽量减少频繁的平衡操作,从而提高插入、删除和查找等操作的效率。

(4)红黑树的应用:

  • 红黑树常被用作关联容器的底层实现,例如在C++的STL中,std::map 和 std::set 就是基于红黑树实现的。
  • 红黑树在存储和数据库系统中也有应用。例如,在数据库索引中,红黑树可以用来维护数据的有序性,从而支持高效的数据检索操作。
  • 在操作系统和调度算法中,红黑树也可以用于管理各种任务和事件,以保持任务的有序性和高效的操作。比如Linux的公平调度算法CFS。
  • 在编译器优化中,红黑树可以用于构建符号表、优化搜索等。

在这里插入图片描述

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

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

相关文章

Dockerfile快速搭建自己专属的LAMP环境

目录 编写Dockerfile 1.文件内容需求: 2.值得注意的是centos6官方源已下线,所以需要切换centos-vault源! 3.Dockerfile内容 4.进入到 lamp 开始构建镜像 推送镜像到私有仓库 1.创建用户并添加到私有仓库:​编辑​编辑 2.推…

CK-A60180、CK-B1542、CK-L3095单向离合器

CK-A1542、CK-A1747、CK-A2052、CK-A2652、CK-A3072、CK-A3580、CK-A4090、CK-A45100、CK-A450110、CK-A60130、CK-A65140、CK-A70150、CK-A75160、CK-A80170、CK-A1250、CK-A1855、CK-A2060、CK-A2563、CK-A2563T、CK-A2870、CK-A3080T、CK-A3585、CK-A35100、CK-A35140、CK-A…

Mybatis对参数的处理

环境配置 项目结构 导入依赖 <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version></dependency><dependency><groupId>mysql</grou…

16、可重入锁+设计模式

可重入锁设计模式 while判断并自旋重试获取锁setnx含自然过期时间Lua脚本官网删除锁命令但不能保证可重如 问题&#xff0c;如何兼顾锁的可重入性问题&#xff1f; 可重入锁 可重入锁又名递归锁 是指在同一个线程在外层方法获取锁的时候&#xff0c;再进入该线程的内层方法…

Vue实战

初始化项目 创建项目 指令&#xff1a; pnpm create vite 实例&#xff1a; C:\Users\Administrator\Desktop\Vue\Vue3_admin_template>pnpm create vite .../Local/pnpm/store/v3/tmp/dlx-6140 | 1 Packages are hard linked from the content-addressable store to…

单体版ruoyi表格绑定按钮

先需要在表格中添加一个按钮&#xff0c;可以快速操作这条数据的某个0/1状态 表格的列 editFlag是检验用户是否有操作的权限 var editFlag [[${permission.hasPermi(pipayshop:itemCommoidtyInfoCategoryTop:edit)}]]; 绑定状态条 /* 用户状态显示 */function statusTools(…

我和 TiDB 的故事 | 远近高低各不同

作者&#xff1a; ShawnYan 原文来源&#xff1a; https://tidb.net/blog/b41a02e6 Hi, TiDB, Again! 书接上回&#xff0c; 《我和 TiDB 的故事 | 横看成岭侧成峰》 &#xff0c;一年时光如白驹过隙&#xff0c;这一年我好似在 TiDB 上投入的时间总量不是很多&#xff0…

baidu一面二叉树路径组数求和

举例&#xff1a;如下图&#xff0c;124125136 386 int sumTree(TreeNode* node,int sum){if(nodenullptr){return 0;}if(node->leftnullptr && node->rightnullptr){sum*10;sumnode->val;return sum;}sum *10;sum node->val;int sum_left sumTree(no…

网络安全---Ring3下动态链接库.so函数劫持

一、动态链接库劫持原理 1.1、原理 Unix操作系统中&#xff0c;程序运行时会按照一定的规则顺序去查找依赖的动态链接库&#xff0c;当查找到指定的so文件时&#xff0c;动态链接器(/lib/ld-linux.so.X)会将程序所依赖的共享对象进行装载和初始化&#xff0c;而为什么可以使用…

NPM 创建和管理组织

目录 1、创建一个组织 2、将用户帐户转换为组织 3、组织中开启双因素身份验证 3.1 关于组织的双因素身份验证 3.2 先决条件 3.3 在您的组织中要求双因素身份验证 3.4 帮助已删除的成员和外部协作者重新加入您的组织 4、重命名组织 5、删除组织 1、创建一个组织 任何n…

HRS--人力资源系统(Springboot+vue)--打基础升级--(三)查询用户信息

接上一集已经写了好导航侧界面&#xff0c;现在写个导航侧功能中的查询用户信息 1. 首先写一个员工信息vue&#xff0c;嗯 就叫employee.vue 2. 特地预留了右边的空白位置是用来展示数据的&#xff0c;所以我们要做子目录的一个关联&#xff0c;其次记得做地址的路由 3. Vue…

FreeRTOS基础六:中断管理2

在中断中使用队列 FreeRTOS的队列可以方便的实现中断传递数据到任务。但是如果数据到来的频率的非常高&#xff0c;导致中断触发频繁&#xff0c;则这种方式是非常不高效的。正如一些Demo所实现的&#xff0c;在UART中断中接收串口数据&#xff0c;然后放到队列中&#xff0c;…

华为OD机试关于无输入截止条件的ACM输入逻辑

无输入截止条件的ACM输入 华为OD机试题中有一些题目是没有输入截止条件的,比如 华为OD机试 - 数字游戏(Java & JS & Python)_伏城之外的博客-CSDN博客 从输入描述来看,每组有两行输入,但是并没有告诉我们具体有几组? 那么输入该如何截止呢? 此时,有两种输入…

CF 1326D Prefix-Suffix Palindrome(最长回文前后缀)

CF 1326D Prefix-Suffix Palindrome(最长回文前后缀) Problem - D2 - Codeforces 大意&#xff1a;给出一个字符串 S &#xff0c; 找出满足以下条件的字符串 T。 1. 字符串 T 尽可能长 并且 |T| ≤ |S| 2.字符串 T 由 S 的一个前缀和后缀拼接而成 &#xff0c; T 是回文串…

2023-08-19 LeetCode每日一题(两整数相加)

2023-08-19每日一题 一、题目编号 2235. 两整数相加二、题目链接 点击跳转到题目位置 三、题目描述 给你两个整数 num1 和 num2&#xff0c;返回这两个整数的和。 示例 1&#xff1a; 示例 2&#xff1a; 提示&#xff1a; -100 < num1, num2 < 100 四、解题代…

攻防世界-fileinclude

原题 解题思路 题目已经告诉了&#xff0c;flag在flag.php中&#xff0c;先查看网页源代码&#xff08;快捷键CTRLU&#xff09;。 通过抓包修改&#xff0c;可以把lan变量赋值flag。在cookie处修改。新打开的网页没有cookie&#xff0c;直接添加“Cookie: languagephp://filte…

29、简单通过git把项目远程提交到gitee

简单通过git把项目远程提交到gitee 1、在gitee上创建一个仓库 2、在要提交的项目文件夹打开git 输入 git init 初始化git 然后设置下用户名和邮箱 git config --global user.name “username” git config --global user.email “yourEmail” 因为我是要把文件简单提交到…

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SCN随机配置网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本…

PNP结算方法(后面可能有空再补充了)

一些pnp的实验结论&#xff1a; &#xff08;1&#xff09;yaw角稳定性上&#xff1a; 在opencv中&#xff0c; SOLVEPNP_UPNPSOLVEPNP_EPNPSOLVEPNP_DLS>>SOLVEPNP_IPPE>SOLVEPNP_AP3P>SOLVEPNP_ITERATIVE 固定一个识别物体检查结算的yaw角在这张图中l1是ippe&…

Vue-9.集成(.editorconfig、.eslintrc.js、.prettierrc)

介绍 同时使用 .editorconfig、.prettierrc 和 .eslintrc.js 是很常见的做法&#xff0c;因为它们可以在不同层面上帮助确保代码的格式一致性和质量。这种组合可以在开发过程中提供全面的代码维护和质量保证。然而&#xff0c;这也可能增加一些复杂性&#xff0c;需要谨慎配置…