第 5 篇:红黑树:工程实践中的平衡大师

上一篇我们探讨了为何有序表需要“平衡”机制来保证 O(log N) 的稳定性能。现在,我们要认识一位在实际工程中应用最广泛、久经考验的“平衡大师”——红黑树 (Red-Black Tree)。

如果你用过 Java 的 TreeMap​ 或 TreeSet​,或者 C++ STL 中的 map​ 或 set​,那么你很可能已经在间接使用红黑树了!它是这些标准库实现有序 Map 和 Set 的默认选择。为什么它如此受青睐?让我们一探究竟。

定位:工业界最常用的内存有序表实现

红黑树是一种自平衡二叉搜索树 (Self-Balancing BST)。它不像 AVL 树那样追求极致的、严格的高度平衡,而是采用了一种更“宽松”但同样有效的平衡策略。这种策略使得红黑树在读取性能和写入(插入/删除)性能之间取得了非常好的平衡,尤其是在写入操作的效率上通常优于 AVL 树。

平衡的奥秘:颜色属性与五条铁律

红黑树不直接跟踪或限制节点的高度差。它的平衡魔法来源于赋予每个节点的颜色属性(红色或黑色),并严格遵守以下 5 条核心规则(或称约束、性质):

  1. 规则 1 (颜色非红即黑): 每个节点要么是红色,要么是黑色。
  2. 规则 2 (根黑): 根节点永远是黑色。
  3. 规则 3 (叶黑): 所有叶子节点(在红黑树的定义中,通常指外部的、不存储数据的 NIL 哨兵节点)都是黑色。这简化了一些边界条件的判断。
  4. 规则 4 (红不相邻): 如果一个节点是红色,那么它的两个子节点(如果存在)必须是黑色。(反过来说,黑色节点的子节点可以是任意颜色)。这条规则限制了红节点的连续出现。
  5. 规则 5 (黑高一致): 对任意一个节点,从该节点到其所有后代叶子节点(NIL 节点)的所有简单路径上,所包含的黑色节点的数量是相同的。这个数量被称为该节点的“黑高 (Black-Height)”。

这五条规则是如何保证平衡的?

虽然看起来有点抽象,但这五条规则(特别是规则 4 和规则 5)共同作用,巧妙地限制了树的结构:

  • 规则 4 (无连续红节点) 限制了路径中红节点的比例。
  • 规则 5 (黑高一致) 保证了从任一节点出发,到达树底的“黑色路径”长度都是相等的。

这两条规则结合起来,可以推导出红黑树的一个重要性质:从根节点到最远叶子节点(最长路径)的长度,不会超过到最近叶子节点(最短路径)长度的两倍。 这就意味着树不会变得过于“偏斜”,其高度始终能维持在 O(log N) 级别(严格来说,高度 h <= 2 * log2(N+1)​)。

因此,红黑树通过这套基于颜色的规则,间接地实现了树的平衡,保证了对数时间复杂度的性能。

核心权衡:读写均衡的艺术

红黑树的设计哲学是在性能上寻求一个平衡点:

  • 写操作(插入/删除)效率高: 为了维持颜色规则,插入和删除操作可能需要进行变色 (Recoloring) 和旋转 (Rotation) 来进行修复 (Fixup)。但相比 AVL 树,红黑树的平衡条件更宽松,通常需要进行的旋转次数更少(插入最多 2 次,删除最多 3 次,都是 O(1) 次数的旋转)。这使得红黑树在需要频繁插入和删除的场景下表现更好。
  • 读操作(查找)效率稳定: 虽然树高可能略高于同样节点数的完美平衡树或 AVL 树,但它仍然严格保证在 O(log N) 范围内。对于大多数应用来说,这种轻微的高度增加带来的查找性能差异可以忽略不计。

实现复杂度:

红黑树的插入修复逻辑相对固定,但删除操作涉及的情况较多,实现起来比 AVL 树的删除可能更复杂一些,需要仔细处理各种颜色和结构组合。这也是为什么标准库会为我们封装好它的原因。

一句话选型总结 (红黑树)

红黑树: 实现内存有序表时,需要稳定 O(log N) 和有序性,且读写操作较为均衡或写操作较多时的行业标准选择 (是 TreeMap​/TreeSet​ 的默认选择)。

实际项目思考 (Java)

  • 当你需要一个有序的 Map 或 Set,并且没有极端性能要求时,直接使用 TreeMap​ 或 TreeSet​ 通常就是最佳选择。 你无需关心其内部红黑树的实现细节,只需享受其提供的 O(log N) 性能和有序特性即可。
  • 动态配置系统: 配置项可能需要按 key 排序展示,并且会有增删改操作。TreeMap​ 很合适。
  • 数据库连接池状态监控: 可能需要按连接的最后活动时间排序,方便管理。TreeMap​ 可以胜任。
  • 需要自定义排序规则的场景: TreeMap​ 和 TreeSet​ 都允许传入 Comparator​,非常灵活。例如,你需要一个按字符串长度排序,再按字典序排序的 Map。

红黑树作为一种久经考验、性能均衡的自平衡二叉搜索树,是计算机科学和软件工程中的重要基石。了解它的基本原理和特性,有助于我们更好地理解和使用 Java 标准库提供的有序集合。

下一篇,我们将简要介绍一下追求极致读性能的 AVL 树,以及基于规模平衡的 SB 树,看看它们与红黑树的对比和适用场景。


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

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

相关文章

第十六届蓝桥杯 2025 C/C++组 客流量上限

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 打表找规律&#xff1a; 核心思路&#xff1a; 思路详解&#xff1a; 得到答案的方式&#xff1a; 按计算器&#xff1a; 暴力求解代码&#xff1a; 快速幂代码&#xff1a; 位运…

一天学完JDBC!!(万字总结)

文章目录 JDBC是什么 1、环境搭建 && 入门案例2、核心API理解①、注册驱动(Driver类)②、Connection③、statement(sql注入)④、PreparedStatement⑤、ResultSet 3、jdbc扩展(ORM、批量操作)①、实体类和ORM②、批量操作 4. 连接池①、常用连接池②、Durid连接池③、Hi…

从原理到实战讲解回归算法!!!

哈喽&#xff0c;大家好&#xff0c;我是我不是小upper, 今天系统梳理了线性回归的核心知识&#xff0c;从模型的基本原理、参数估计方法&#xff0c;到模型评估指标与实际应用场景&#xff0c;帮助大家深入理解这一经典的机器学习算法&#xff0c;助力数据分析与预测工作。 …

【dify—10】工作流实战——文生图工具

目录 一、创建工作流 应用 二、安装硅基流动 三、配置硅基流动 四、API测试 &#xff08;1&#xff09;进入API文档 &#xff08;2&#xff09;复制curl代码 &#xff08;3&#xff09;Postman测试API 五、 建立文生图工作流 &#xff08;1&#xff09;建立http请求 &…

Rust将结构导出到json如何处理小数点问题

简述 标准的 serde_json 序列化器不支持直接对浮点数进行格式化限制。如果将浮点数转换成字符串&#xff0c;又太low逼。这里重点推荐rust_decimal。 #[derive(Serialize)] pub struct StockTickRow {datetime: NaiveDateTime,code: String,name: String,#[serde(serialize_w…

openEuler 22.03 安装 Redis 6.2.9,支持离线安装

目录 一、环境检查1.1 必要环境检查1.2 在线安装&#xff08;有网络&#xff09;1.3 离线安装&#xff08;无网络&#xff09; 二、下载Redis2.1 在线下载2.2 离线下载 三、安装Redis四、配置Redis服务五、开机自启服务六、开放防火墙端口七、常用命令 一、环境检查 1.1 必要环…

MySQL基本查询(二)

文章目录 UpdateDelete插入查询结果&#xff08;select insert&#xff09;聚合函数分组聚合统计 Update 1. 语法&#xff1a; set后面加列属性或者表达式 UPDATE table_name SET column expr [, column expr …][WHERE …] [ORDER BY …] [LIMIT …] 案例 将孙悟空同学的…

Android Framework学习二:Activity创建及View绘制流程

文章目录 Window绘制流程Window Manager Service&#xff08;WMS&#xff09;SurfaceSurfaceFlinger 安卓View层次结构ActivityPhoneWindowActivity与PhoneWindow两者之间的关系ViewRootImplDecorViewDecorView 的作用DecorView 的结构总结 Activity创建流程View invalidate调用…

基于ssm的智慧养老平台(全套)

一、系统架构 前端&#xff1a;jsp | js | jquery | css 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | tomcat 二、代码及数据库 三、功能介绍 01. 登录 02. 管理员-主页 03. 管理员-个人中心 04. 管理员-…

计算机视觉技术的发展历程

计算机视觉技术的发展历程可以分为以下几个阶段&#xff1a; 早期探索阶段&#xff08;1960s-1980s&#xff09; 1960年代&#xff1a;计算机视觉的概念开始形成&#xff0c;研究者尝试让计算机识别和理解图像&#xff0c;主要集中在基础的图像处理&#xff0c;如边缘检测和特…

2025五一杯B题五一杯数学建模思路代码文章教学: 矿山数据处理问题

完整内容请看文章最下面的推广群 问题1. 根据附件1中的数据和&#xff0c;建立数学模型&#xff0c;对数据A进行某种变换&#xff0c;使得变换后的结果与数据尽可能接近。计算变换后的结果与数据的误差&#xff0c;并分析误差的来源&#xff08;如数据噪声、模型偏差等&#xf…

.NET 平台详解

什么是 .NET&#xff1f; .NET 是一个由微软开发的跨平台、开源的开发者平台&#xff0c;用于构建多种类型的应用程序。它提供了一致的编程模型和丰富的类库&#xff0c;支持多种编程语言&#xff08;如 C#、F#、Visual Basic&#xff09;。 .NET 的核心组成 运行时环境 CLR …

ICRA 2025 基于触觉反馈的闭环分层控制框架——开放环境下通用门开启的智能规划与操作

在机器人领域&#xff0c;让机器人在开放环境中与日常物品交互一直是个难题&#xff0c;其中开门任务极具挑战性。门的设计、机械结构和推拉方式多种多样&#xff0c;现有方法存在诸多局限。基于运动学的方法依赖已知门模型&#xff0c;面对未知门时难以发挥作用&#xff1b;几…

阿里云服务迁移实战: 07-其他服务迁移

概述 当完成了服务器、数据库、IP、OSS等迁移后&#xff0c;剩下的就是其他服务了。 短信网关 短信模板只能一个个创建&#xff0c;不能批量操作。但是可以使用以下方式优化操作。 在原账号导出模板列表 概述 当完成了服务器、数据库、IP、OSS等迁移后&#xff0c;剩下的…

(六——下)RestAPI 毛子(Http resilience/Refit/游标分页/异步大文件上传)

文章目录 项目地址一、Refit1.1 安装需要的包1.2 创建接口IGitHubApi1.3 创建RefitGitHubService1. 实现接口2. 注册服务 1.4 修改使用方法 二、Http resilience2.1 安装所需要的包2.2 创建resilience pipeline简单版2.3 创建全局的resilience处理1. 创建清理全局ResilienceHan…

leetcode 977. Squares of a Sorted Array

题目描述 双指针法一 用right表示原数组中负数和非负数的分界线。 nums[0,right-1]的是负数&#xff0c;nums[right,nums.size()-1]是非负数。 然后用合并两个有序数组的方法。合并即可。 class Solution { public:vector<int> sortedSquares(vector<int>&…

在 API 模拟阶段:Apipost vs. Faker.js vs. Postman —— 为什么 Apipost 是最优选择

在构建 API 的过程中&#xff0c;模拟数据的能力至关重要。就像你在做饭时等待食材送达一样——没有原料&#xff0c;菜也没法完成。 但是&#xff0c;当你的后端还在开发中&#xff0c;而前端又急需真实的 API 响应进行开发时&#xff0c;该怎么办&#xff1f;这时候&#xf…

一种快速计算OTA PSRR的方法(Ⅰ)

序言:最近碰到了一道有趣的习题&#xff0c;让我重新思考了下如何计算运放的PSRR&#xff0c;再结合相关论文&#xff0c;现将所思所想分享出来&#xff0c;欢迎大家讨论。 1.从Razavi的一道习题引入 题目要求计算电路的PSRR&#xff0c;已知PSRR定义为信号增益除以电源增益&am…

第十二届蓝桥杯 2021 C/C++组 空间

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 空间 - 蓝桥云课 思路&#xff1a; 思路详解&#…

TensorFlow深度学习实战——基于循环神经网络的情感分析模型

TensorFlow深度学习实战——基于循环神经网络的情感分析模型 0. 前言1. 数据处理2. 模型构建与训练3. 模型评估相关链接 0. 前言 情感分析 (Sentiment Analysis) 是自然语言处理中的一项技术&#xff0c;旨在识别和提取文本中的情感信息&#xff0c;通常是分析一段文本中是否存…