深入理解红黑树:原理、实现与应用
深入理解红黑树:原理、实现与应用
引言
红黑树(Red-Black Tree)是计算机科学中一种重要的自平衡二叉查找树。它通过简单的规则和高效的调整策略,保证了插入、删除、查找等操作的时间复杂度均为 O(log n)
。红黑树广泛应用于实际开发中,例如Java的TreeMap
、HashMap
(解决哈希冲突的链表转红黑树)、Linux内核的进程调度等。本文将详细讲解红黑树的核心特性、操作原理,并通过代码示例和实际应用场景帮助读者深入理解这一数据结构。
红黑树的核心特性
红黑树通过以下规则确保平衡性:
- 节点着色:每个节点非红即黑。
- 根节点:根节点必须为黑色。
- 叶子节点:所有叶子节点(NIL节点)为黑色。
- 红色节点限制:红色节点的子节点必须为黑色(即不能有连续红色节点)。
- 黑色高度一致:从任意节点到其所有叶子节点的路径包含相同数量的黑色节点。
红黑树的优势与适用场景
优势
- 高效自平衡:插入/删除后通过旋转和重新着色快速恢复平衡。
- 稳定性能:所有操作的时间复杂度稳定在
O(log n)
。 - 实现相对简单:相比AVL树,红黑树的平衡条件更宽松,减少旋转次数。
适用场景
- 高频插入删除:例如数据库索引、内存管理。
- 需要稳定查询性能:如实时系统、游戏引擎。
- 替代哈希表:当需要有序遍历时(如Java的
TreeMap
)。
红黑树 VS AVL树
特性 | 红黑树 | AVL树 |
---|---|---|
平衡标准 | 宽松(黑色高度一致) | 严格(左右子树高度差≤1) |
插入/删除效率 | 更高(旋转次数少) | 较低(频繁旋转) |
查找效率 | 略低(树高度稍高) | 更高(严格平衡) |
适用场景 | 频繁修改的场景 | 静态数据或查询为主场景 |
插入操作
红黑树的插入分为两步:标准BST插入和平衡调整。新节点默认红色,若破坏红黑树规则,则通过旋转和重新着色修复。
插入示例与调整(附图示)
假设我们有一个初始为空的红黑树,并逐步插入元素来展示红黑树的插入和调整过程。
- 插入元素 10
10 (黑色)
- 插入元素 20
10 (黑色)\20 (红色)
- 插入元素 30
10 (黑色)\20 (黑色)\30 (红色)
- 插入元素 15
10 (黑色)\20 (红色)/ \15 (红色) 30 (红色)
-
调整后(右旋和重新着色):
20 (黑色)/ \10 (红色) 30 (黑色)\15 (红色)
- 插入元素 5
20 (黑色)/ \10 (红色) 30 (黑色)/ \
5 (红色) 15 (红色)
- 调整后(重新着色):
20 (黑色)/ \10 (黑色) 30 (黑色)/ \5 (红色) 15 (红色)
- 插入元素 12
20 (黑色)/ \10 (黑色) 30 (黑色)/ \
5 (红色) 15 (黑色)/12 (红色)
- 调整后(重新着色):
20 (黑色)/ \10 (黑色) 30 (黑色)/ \5 (红色) 15 (红色)/12 (黑色)
旋转操作
红黑树的调整主要通过旋转操作来实现。常见的旋转操作包括左旋和右旋。
左旋
y x/ \ / \
a x 左旋(y) y c/ \ -------> / \b c a b
右旋
y x/ \ / \
x c 右旋(y) a y
/ \ -------> / \
a b b c
重新着色操作
重新着色是指改变节点的颜色,以满足红黑树的性质。
代码实现示例
class RedBlackTree {private static final boolean RED = true;private static final boolean BLACK = false;private class Node {int key;Node left, right, parent;boolean color;Node(int key) {this.key = key;left = right = parent = null;this.color = RED;}}private Node root;public RedBlackTree() {root = null;}private void leftRotate(Node x) {Node y = x.right;x.right = y.left;if (y.left != null) y.left.parent = x;y.parent = x.parent;if (x.parent == null) root = y;else if (x == x.parent.left) x.parent.left = y;else x.parent.right = y;y.left = x;x.parent = y;}private void rightRotate(Node y) {Node x = y.left;y.left = x.right;if (x.right != null) x.right.parent = y;x.parent = y.parent;if (y.parent == null) root = x;else if (y == y.parent.right) y.parent.right = x;else y.parent.left = x;x.right = y;y.parent = x;}private void insertFixup(Node z) {while (z.parent != null && z.parent.color == RED) {if (z.parent == z.parent.parent.left) {Node y = z.parent.parent.right;if (y != null && y.color == RED) {z.parent.color = BLACK;y.color = BLACK;z.parent.parent.color = RED;z = z.parent.parent;} else {if (z == z.parent.right) {z = z.parent;leftRotate(z);}z.parent.color = BLACK;z.parent.parent.color = RED;rightRotate(z.parent.parent);}} else {Node y = z.parent.parent.left;if (y != null && y.color == RED) {z.parent.color = BLACK;y.color = BLACK;z.parent.parent.color = RED;z = z.parent.parent;} else {if (z == z.parent.left) {z = z.parent;rightRotate(z);}z.parent.color = BLACK;z.parent.parent.color = RED;leftRotate(z.parent.parent);}}}root.color = BLACK;}public void insert(int key) {Node z = new Node(key);Node y = null;Node x = root;while (x != null) {y = x;if (z.key < x.key) x = x.left;else x = x.right;}z.parent = y;if (y == null) root = z;else if (z.key < y.key) y.left = z;else y.right = z;z.left = z.right = null;z.color = RED;insertFixup(z);}private void inorder(Node node) {if (node != null) {inorder(node.left);System.out.print(node.key + " (" + (node.color ? "RED" : "BLACK") + ") ");inorder(node.right);}}public void inorder() {inorder(root);System.out.println();}public static void main(String[] args) {RedBlackTree tree = new RedBlackTree();tree.insert(10);tree.insert(20);tree.insert(30);tree.insert(15);tree.insert(5);tree.insert(12);System.out.println("Inorder traversal of the constructed Red Black Tree:");tree.inorder();}
}
运行结果
Inorder traversal of the constructed Red Black Tree:
5 (RED) 10 (BLACK) 12 (BLACK) 15 (RED) 20 (BLACK) 30 (BLACK)
通过上述代码和示例,我们可以看到红黑树在插入元素时如何通过旋转和重新着色来保持平衡。
删除操作
删除操作比插入更复杂,需处理以下情况:
- 删除节点为红色:直接删除,无需调整。
- 删除节点为黑色:需通过旋转和重新着色修复黑色高度。
删除调整策略
- 兄弟节点为红色:旋转父节点,转换为兄弟节点为黑的情况。
- 兄弟节点为黑色且子节点全黑:重新着色,向上递归调整。
- 兄弟节点为黑且有红子节点:通过旋转和着色修复。
实际应用案例
案例1:Java TreeMap
Java的TreeMap
使用红黑树存储键值对,支持有序遍历和范围查询。
TreeMap<Integer, String> map = new TreeMap<>();
map.put(10, "A");
map.put(20, "B");
// 内部通过红黑树维护键的顺序
案例2:Linux内核进程调度
Linux的Completely Fair Scheduler (CFS)
使用红黑树管理进程队列,快速选择下一个执行的进程。
常见问题解答(FAQ)
Q1:红黑树为什么比AVL树实现简单?
A:红黑树的平衡条件更宽松(仅需保证黑色高度一致),减少旋转次数,代码逻辑相对简单。
Q2:如何处理删除黑色节点后的平衡?
A:通过检查兄弟节点颜色和子节点情况,递归调整颜色或旋转,恢复黑色高度。
总结
红黑树凭借其高效的自平衡特性,成为工程中不可或缺的数据结构。理解其核心规则和调整策略,能够帮助开发者更好地应用在需要动态数据管理的场景中。后续可进一步学习B树、跳表等扩展结构,以应对不同场景的需求。
相关文章:
深入理解红黑树:原理、实现与应用
深入理解红黑树:原理、实现与应用 引言 红黑树(Red-Black Tree)是计算机科学中一种重要的自平衡二叉查找树。它通过简单的规则和高效的调整策略,保证了插入、删除、查找等操作的时间复杂度均为 O(log n)。红黑树广泛应用于实际开…...
Java学习手册:Java并发编程最佳实践
在Java并发编程中,遵循最佳实践可以显著提高程序的性能、可靠性和可维护性。本文将总结Java并发编程中的关键最佳实践,帮助开发者避免常见陷阱并编写高效的并发程序。 1. 选择合适的并发工具 Java提供了丰富的并发工具,选择合适的工具可以简…...
接口自动化测试(二)
一、接口测试流程:接口文档、用例编写 拿到接口文档——编写接口用例以及评审——进行接口测试——工具/自动化框架进行自动化用例覆盖(70%)——输出测试报告 自动化的目的一般是为了回归 第一件事情:理解需求,学会看接口文档 只需要找到我…...
C++类和对象上
1. 面向对象编程与面向过程编程的比较 我们一开始接触的C语言就是一门面向过程编程的语言,而C就是一门面向对象编程的语言。那么这两者有什么区别呢? 举个例子,就比如说点外卖,如果是C语言的话,那么在程序的编写过程…...
hadoop的三大结构及各自的作用
Hadoop 分布式文件系统(HDFS) 存储大量数据:HDFS 被设计用于在商品硬件上存储海量数据,它将大文件分割成多个数据块,并分布存储在集群中的不同节点上,支持数据的可靠存储和高效访问。提供数据冗余和容错机制…...
珈和科技遥感赋能农业保险创新 入选省级卫星应用示范标杆
为促进空天信息与数字经济深度融合,拓展卫星数据应用场景价值,提升卫星数据应用效能和用户体验,加速卫星遥感技术向民生领域转化应用,近日,湖北省国防科工办组织开展了2024年湖北省卫星应用示范项目遴选工作。 经多渠…...
香港服务器CPU对比:Intel E3与E5系列核心区别与使用场景
香港服务器的 CPU 配置(核心数与主频)直接决定了其并发处理能力和数据运算效率,例如高频多核处理器可显著提升多线程任务响应速度。在实际业务场景中,不同负载需求对 CPU 架构的要求存在显著差异——以 Intel E3 和 E5 系列为例,由于两者在性…...
【人工智能】DeepSeek 与 RAG 技术:构建知识增强型问答系统的实战
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 本文深入探讨了如何利用 DeepSeek R1 模型结合检索增强生成(RAG)技术,构建一个高效的知识增强型问答系统。RAG 技术通过结合信息检索与生…...
得佳胜哲讯科技 SAP项目启动会:胶带智造新起点 数字转型新征程
在全球制造业加速向数字化、智能化转型的浪潮中,胶带制造行业正迎来以“自动化生产、数据化运营、智能化决策”为核心的新变革。工业互联网、大数据分析与智能装备的深度融合,正推动胶带制造从传统生产模式向“柔性化生产精准质量控制全链路追溯”的智慧…...
超导体的应用价值:超导磁探测技术开启科技与生活的新变革
科技的飞速发展,带来了一种新型材料的快速应用,那就是超导体材料。超导体的特性,能够为当今社会众多领域带来革命性的变革,也将极大的改变我们现在的生活质量。 超导体的特性 超导体是指在特定温度下的电阻会突然消失,…...
UNION和UNION ALL的主要区别
UNION和UNION ALL的主要区别在于处理重复数据和排序的方式。 UNION和UNION ALL都是SQL语言中用于合并两个或多个SELECT语句结果集的关键字。它们的主要区别如下: 1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,而UNION ALL不会…...
软件项目验收报告模板
软件项目验收报告 一、项目基本信息 项目名称XX智能仓储管理系统开发单位XX科技有限公司验收单位XX物流集团合同签订日期2023年3月15日项目启动日期2023年4月1日验收日期2024年1月20日 二、验收范围 入库管理模块(包含RFID识别、库存预警)出库调度模…...
第五章 SQLite数据库:5、SQLite 进阶用法:JOIN、UNION、TRIGGER、INDEX、ALIAS、INDEXED BY 等模块
一、JOIN:跨表查询的核心机制 1. JOIN 类型总览 JOIN 是连接多个表获取综合信息的关键手段。常见 JOIN 类型如下: INNER JOIN(内连接):仅返回两个表中满足连接条件的行。LEFT OUTER JOIN(左连接…...
中间件--ClickHouse-10--海量数据存储如何抉择ClickHouse和ES?
在Mysql数据存储或性能瓶颈时,采用冷热数据分离的方式通常是一种选择。ClickHouse和Elasticsearch(ES)是两个常用的组件,但具体使用哪种组件取决于冷数据的存储目的、查询模式和业务需求等方面。 1、核心对比 (1&…...
JESD204B标准及其在高速AD采集系统中的应用详解
一、JESD204B协议的本质与核心价值 JESD204B是由JEDEC制定的第三代高速串行接口标准(2011年发布),专为解决高速ADC/DAC与FPGA/ASIC间数据传输瓶颈而设计。其核心突破体现在: 速率革命性提升 支持每通道最高12.5Gbps(通…...
给予FLUX更好的控制:FLUX.1-dev-ControlNet-Union-Pro-2.0
Shakker Labs FLUX.1-dev-ControlNet-Union-Pro-2.0 一、模型概述 Shakker Labs发布的FLUX.1-dev-ControlNet-Union-Pro-2.0是一个统一的ControlNet模型,专为FLUX.1-dev模型设计。该模型在前一版本基础上进行了多项改进,包括移除模式嵌入以减小模型尺寸…...
Hadoop的三大结构及其作用?
Hadoop是一个分布式存储和计算框架,其三大核心组件是HDFS(Hadoop Distributed File System)、YARN(Yet Another Resource Negotiator)和MapReduce。它们各自有着重要的作用,共同构成了Hadoop生态系统的基础…...
langgraph框架之初识
1.什么是langgraph? LangGraph 是一个用于构建可控代理的底层编排框架。在AI中,代理也就是执行动作的智能体,也就是agent。使用这个框架可以构建一个可以自由控制的智能执行体,它可以帮我们做许多事情,如下࿱…...
3个实用的脚本
1. Linux 系统清理临时文件脚本 该脚本用于清理系统中 /tmp 目录下超过 7 天的临时文件。 #!/bin/bash# 清理 /tmp 目录下超过 7 天的文件 find /tmp -type f -atime 7 -exec rm -f {} \;# 清理 /var/tmp 目录下超过 7 天的文件 find /var/tmp -type f -atime 7 -exec rm -f {…...
Vue3 Composition API与十大组件开发案例详解
文章目录 一、Vue3核心API解析1.1 Composition API优势1.2 核心API 二、十大组件开发案例案例1:响应式表单组件案例2:动态模态框(Teleport应用)案例3:可复用列表组件案例4:全局状态通知组件案例5࿱…...
万用表判断MOS好坏
无论什么封装,D极一般在正面看的上面,或者焊盘面积最大的一面: 【零】烧个洞的那种,不用量了,一眼损坏 【一】万用表的二极管档位测量 检修:使用万用表的二极管档位,S极接红表笔,黑…...
算法驱动光场革命:SLM技术引领智能光学新时代
◀背景引入▶ 空间光调制器本质上是一种能够对光波的振幅、相位或偏振状态进行空间分布调制的动态光学器件,我司自主研发的SLM产品采用硅基液晶技术,通过电信号控制液晶分子的排列状态,实现对入射光波的精确调控。这种精确调控能力使得SLM成…...
webgl入门实例-11WebGL 视图矩阵 (View Matrix)基本概念
WebGL 视图矩阵 (View Matrix) 在WebGL中,视图矩阵(View Matrix)定义了观察者(相机)在世界空间中的位置和方向,它实现了从世界坐标系到相机坐标系的转换。 什么是视图矩阵? 视图矩阵是一个4x4的矩阵,用于: 将场景从…...
ESP32 搭建IDF+Vscode环境(详细教程)
1. IDF环境安装 1.1 ESP-IDF介绍 ESP-IDF (Espressif IoT Development Framework) 是 Espressif( 乐鑫) 公司提供的面向ESP32 系列 的官方开源开发框架,用于开发物联网应用。ESP-IDF 的特点是高度的集成性和可移植性,提供了完整的 SDK,…...
精准计量+AI管控——安科瑞助力高校水电管理数字化转型
安科瑞顾强 传统管理痛点:效率低、隐患多、成本高 高校后勤水电管理长期面临多重挑战:人工抄表需宿管逐层逐户记录,耗时耗力且易出现漏抄、错抄,导致费用核算不公;老旧机械式电表误差率高达5%-10%,计量纠…...
PHP腾讯云人脸核身获取SIGN Ticket
参考腾讯云官方文档:人脸核身 获取 SIGN ticket_腾讯云 前提条件:已经获取了access_token。获取方法可参考: PHP腾讯云人脸核身获取Access Token-CSDN博客 public function getSignTicket(){$access_token file_get_contents(/data/confi…...
探索 Higress:下一代云原生 API 网关
引言 在云原生时代,API 网关作为连接客户端与后端服务的桥梁,扮演着至关重要的角色。Higress 是一款由阿里巴巴开发的先进云原生 API 网关,基于开源的 Istio 和 Envoy 构建。它通过将流量网关、微服务网关和安全网关三者高度集成,…...
UE5编辑器静止状态下(非 Play 模式)睫毛和眼睛的渲染是正常的,而在 Play 模式下出现模糊
这通常指向以下几个 运行时(Runtime) 特有的原因: 抗锯齿 (Anti-Aliasing) 方法,特别是 Temporal Anti-Aliasing (TAA): 这是最可能的原因。 UE5 默认启用的 TAA 通过混合多帧信息来平滑边缘和减少闪烁,尤其是在运动中…...
ubuntu-24.04.2-live-server-arm64基于cloud-init实现分区自动扩容(LVM分区模式)
1. 环境 虚拟机镜像ISO:ubuntu-24.04.2-live-server-arm64.iso 2. 定制cloud-init镜像 2.1 安装OS 基于ubuntu-24.04.2-live-server-arm64.iso,通过virt-manager安装操作系统,语言建议选择英文,分区选择基于LVM的自动分区&…...
解决 Spring Boot 多数据源环境下事务管理器冲突问题(非Neo4j请求标记了 @Transactional 尝试启动Neo4j的事务管理器)
0. 写在前面 到底遇到了什么问题? 简洁版: 在 Oracle 与 Neo4j 共存的多数据源项目中,一个仅涉及 Oracle 操作的请求,却因为 Neo4j 连接失败而报错。根本原因是 Spring 的默认事务管理器错误地指向了 Neo4j,导致不相…...
直线轴承在自动化机械设备中的应用
直线轴承作为机械传动系统中的关键部件,凭借其高精度、低摩擦和稳定性能,被广泛应用于各类自动化设备中。以下是直线轴承在自动化领域的典型应用场景: CNC机床 在数控机床的进给系统中,直线轴承与精密导轨配合使用,为刀…...
生物化学笔记:医学免疫学原理22 肿瘤及肿瘤治疗
肿瘤及肿瘤治疗 免疫疗法 CAR-T细胞介绍...
6.数据手册解读—运算放大器(二)
目录 6、细节描述 6.1预览 6.2功能框图 6.3 特征描述 6.3.1输入保护 6.3.1 EMI抑制 6.3.3 温度保护 6.3.4 容性负载和稳定性 6.3.5 共模电压范围 6.3.6反相保护 6.3.7 电气过载 6.3.8 过载恢复 6.3.9 典型规格与分布 6.3.9 散热焊盘的封装 6.3.11 Shutdown 6.4…...
010数论——算法备赛
数论 模运算 一般求余都是对正整数的操作,如果对负数,不同编程语言结果可能不同。 C/javapythona>m,0<a%m<m-1 a<m,a%ma~5%32~-5%3 -21(-5)%(-3) -2~5%(-3)2-1正数:(ab)%m((a%m)(b%m))%m~正数ÿ…...
算法01-最小生成树prim算法
最小生成树prim算法 题源:代码随想录卡哥的题 链接:https://kamacoder.com/problempage.php?pid1053 时间:2025-04-18 难度:4⭐ 题目: 1. 题目描述: 在世界的某个区域,有一些分散的神秘岛屿&…...
轻量化高精度的视频语义分割
Video semantic segmentation (VSS)视频语义分割 Compact Models(紧凑模型) 在深度学习中,相对于传统模型具有更小尺寸和更少参数数量的模型。这些模型的设计旨在在保持合理性能的同时,减少模型的计算和存储成本。 紧凑模型的设计可以涉及以下一些技术: 深度剪枝(Deep…...
【AI飞】AutoIT入门七(实战):python操控autoit解决csf视频批量转换(有点难,AI都不会)
背景: 终极目标:通过python调用大模型,获得结果,然后根据返回信息,控制AutoIT操作电脑软件,执行具体工作。让AI更具有执行力。 已完成部分: 关于python调用大模型的,可以参考之前的…...
Android守护进程——Vold (Volume Daemon)
简介 介绍:Vold 是用来管理 android 系统的存储设备,如U盘、SD卡、磁盘等移动设备的热插拔、挂载、卸载、格式化 框架结构:Vold 在系统中以守护进程存在,是一个单独的进程。处于Kernel和Framework之间,是两个层级连接…...
【实体转换】mapstruct详解
大家好,我是jstart千语。今天来给大家讲讲在项目中经常可以使用得到的一个“工具”,就是mapstruct。 一、工具介绍 这个工具有些类似于spring提供的BeanUtils.copyProperties()用于对象转化。而mapstruct是通过生成高效的、类型安全的映射代码来帮助开发…...
部署路线Ubuntu_MySQL_Django_绑定域名
第 1 步:绑定域名(DNS) 在域名服务商后台(例如阿里云 / 腾讯云 / Cloudflare)中设置: A 记录 →域名 → 指向服务器公网 IP 可选:也加一个 www.域名 → 同样指向服务器 第 2 步:安…...
大屏设计与汇报:政务服务可视化实践
大屏设计与汇报:政务服务可视化实践 引言 在政务服务数字化转型浪潮中,大屏设计成为展现业务能力与数据价值的关键手段。本文围绕政务大屏设计,从设计要点、业务逻辑到汇报技巧展开深入探讨,为相关从业者提供全面参考。 一、大屏设计核心要点 (一)多维度考量 设计大…...
【MySQL】数据库和表的操作详解
目录 一、数据库: 1、查看数据库: 2、创建数据库: 3、删除数据库: 4、数据库的编码问题: 5、校验规则对数据库的影响: 6、修改数据库: 7、库的备份与恢复: 8、查看链接情况…...
从PDF到播客:MIT开发的超越NotebookLM的工具
NotebookLM是谷歌推出的更具创意的AI产品之一,几个月前刚刚推出。 许多人对它的能力感到惊叹——尤其是将长文本转化为两位播客主持人之间有趣对话的功能。 NotebookLM提供的不仅仅是这些,还包括聊天(问答)甚至生成思维导图。 如果你还没有尝试过NotebookLM,我强烈建议…...
ubuntu系统上基于RKE2部署K8S及Rancher
由于我们特殊的网络环境,所以只能使用国内资源来进行安装 - Rancher Releases Mirrors:https://mirror.rancher.cn/ - 阿里云镜像仓库:registry.cn-hangzhou.aliyuncs.com 1、配置资源仓库及token rootdemo-1:~# mkdir -p /etc/rancher/r…...
STM32单片机入门学习——第40节: [11-5] 硬件SPI读写W25Q64
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.18 STM32开发板学习——第一节: [1-1]课程简介第40节: [11-5] 硬件SPI读…...
vue3学习笔记之属性绑定
属性绑定 1. 基本语法 在 Vue 3 里,使用 : 或者 v-bind: 来进行属性绑定。这两种写法是等价的,: 是 v-bind: 的缩写形式。以下是示例代码: <template><!-- 使用缩写形式 --><img :src"imageUrl" alt"An exa…...
C++ 面向对象关键语法详解:override、虚函数、转发调用和数组引用传参-策略模式
int A(参数...) override { return 某个对象.A(参数...);} 一.目标 本文将用一个简单的“数学运算器”例子,从零解释以下 C 语法特性: virtual 虚函数 override 重写关键字 函数体内部的“转发调用” 数组引用作为函数参数 适合初学者和希望加深…...
Spring_MVC 快速入门指南
Spring_MVC 快速入门指南 一、Spring_MVC 简介 1. 什么是 Spring_MVC? Spring_MVC 是 Spring 框架的一个模块,用于构建 Web 应用程序。它基于 MVC(Model-View-Controller)设计模式,将应用程序分为模型(M…...
Starrocks 数据均衡DiskAndTabletLoadReBalancer的实现
背景 最近在研究了一下 Starrocks的tablet的Rebalance的能力,这里进行记录一下 本文基于 StarRocks 3.3.5 结论 数据的rebalance 主要以两种模式来进行: 按照磁盘的使用率进行移动,如果每个BE的磁盘使用率不足tablet_sched_balance_load_…...
设计模式之工厂方法模式
1. 核心思想 工厂方法模式(Factory Method Pattern)将对象的创建过程延迟到子类。具体来说,定义一个创建对象的接口(抽象工厂),但由子类决定实例化哪个具体类。这种方式解耦了对象的创建和使用,…...