四大自平衡树对比:AVL树、红黑树、B树与B+树
AVL树、红黑树、B树和B+树的对比与应用场景
树系列相关文章(置顶)
1、从链表到平衡树:二叉查找树的退化与优化
2、自平衡二叉查找树:如何让二叉查找树始终保持高效
3、AVL树入门:理解自平衡二叉查找树的基础
4、红黑树全解:概念、操作方法及常见应用
5、揭秘B树与B+树:如何保持高效的磁盘访问
6、四大自平衡树对比:AVL树、红黑树、B树与 B+树
引言
AVL树、红黑树、B树和B+树是四种常见的自平衡数据结构,广泛应用于计算机科学中。每种树都有其独特的特点和适用场景。本文将详细介绍这四种树的概念、特点,并通过表格形式对比它们的不同之处,最后探讨它们在实际应用中的区别。

1. 各种树的特点
1.1 AVL树
概念
AVL树(Adelson-Velsky and Landis Tree)是一种严格平衡的二叉查找树,通过限制每个节点左右子树的高度差不超过1来保持平衡。
特点
- 高度严格平衡:每个节点左右子树的高度差不超过1。
- 高效查找:由于严格的平衡性,查找、插入和删除操作的时间复杂度均为 O ( log n ) O(\log n) O(logn)。
- 频繁旋转:为了维持严格的平衡性,插入和删除操作可能需要较多的旋转操作。
1.2 红黑树
概念
红黑树(Red-Black Tree)是一种近似平衡的二叉查找树,通过着色规则和旋转操作确保树的高度接近对数级别 O ( log n ) O(\log n) O(logn)。
特点
- 颜色属性:每个节点要么是红色,要么是黑色。
- 相对宽松的平衡:允许一定程度的不平衡,但通过严格的着色规则保证整体平衡性。
- 较少旋转:相比AVL树,红黑树的插入和删除操作所需的旋转次数较少。
- 广泛应用:C++标准库中的
std::map和std::set通常使用红黑树实现。
1.3 B树
概念
B树(B-Tree)是一种多路查找树,每个节点可以包含多个键值和子节点指针,适合磁盘存储,减少磁盘I/O次数。
特点
- 多路查找:每个节点可以有多个子节点。
- 高度平衡:所有叶子节点位于同一层,确保树的高度接近对数级别 O ( log n ) O(\log n) O(logn)。
- 高效磁盘访问:适合磁盘存储,减少磁盘I/O次数。
- 内部节点存储数据:内部节点和叶子节点都可以存储数据记录。
1.4 B+树
概念
B+树(B±Tree)是一种改进的B树,主要特点是所有的数据记录都存储在叶子节点中,而非叶子节点只存储索引信息。
特点
- 数据存储在叶子节点:所有数据记录都存储在叶子节点中,非叶子节点只存储索引信息。
- 叶子节点链表:所有叶子节点通过指针连接成一个双向链表,支持高效的顺序扫描。
- 高度平衡:所有叶子节点位于同一层,确保树的高度接近对数级别 O ( log n ) O(\log n) O(logn)。
- 高效磁盘访问:适合磁盘存储,减少磁盘I/O次数。
- 范围查询效率高:由于所有数据记录都在叶子节点中,B+树更适合范围查询和顺序扫描。
2. 对比汇总表
为了更清晰地对比AVL树、红黑树、B树和B+树的特点,我们整理了一个详细的表格。这个表格涵盖了每种树的关键特性,并突出了它们在不同应用场景中的优势。
| 特性 | AVL树 | 红黑树 | B树 | B+树 |
|---|---|---|---|---|
| 高度平衡 | 严格平衡(高度差不超过1) | 相对宽松的平衡 | 高度平衡 | 高度平衡 |
| 查找时间复杂度 | O ( log n ) O(\log n) O(logn) | O ( log n ) O(\log n) O(logn) | O ( log n ) O(\log n) O(logn) | O ( log n ) O(\log n) O(logn) |
| 插入/删除复杂度 | O ( log n ) O(\log n) O(logn),频繁旋转 | O ( log n ) O(\log n) O(logn),较少旋转 | O ( log n ) O(\log n) O(logn) | O ( log n ) O(\log n) O(logn) |
| 数据存储位置 | 内部节点和叶子节点都存储数据 | 内部节点和叶子节点都存储数据 | 内部节点和叶子节点都存储数据 | 只有叶子节点存储数据 |
| 范围查询效率 | 较低 | 较低 | 较低 | 较高,通过叶子节点链表 |
| 顺序扫描效率 | 较低 | 较低 | 较低 | 较高,通过叶子节点链表 |
| 磁盘I/O效率 | 较高,减少读取次数 | 较高,减少读取次数 | 较高,减少读取次数 | 较高,减少读取次数 |
| 内存占用 | 较高,频繁旋转 | 较低,较少旋转 | 较高,内部节点也存储数据 | 较低,只有叶子节点存储数据 |
| 适用场景 | 实时系统、嵌入式系统 | 通用场景、C++标准库std::map/set | 文件系统、数据库索引(高效磁盘访问) | 数据库索引、文件系统(范围查询和顺序扫描) |
补充说明
-
高度平衡:AVL树要求每个节点左右子树的高度差不超过1,而红黑树允许一定程度的不平衡,但通过严格的着色规则保证整体平衡性。B树和B+树则通过多路查找确保所有叶子节点位于同一层。
-
查找时间复杂度:四种树的查找操作时间复杂度均为 O ( log n ) O(\log n) O(logn),但由于AVL树的严格平衡性,它在查找方面表现尤为突出。
-
插入/删除复杂度:AVL树由于需要频繁进行旋转以维持严格平衡,因此在插入和删除操作上可能会比红黑树消耗更多的时间。红黑树通过较少的旋转操作,在插入和删除时性能更优。
-
数据存储位置:B树和AVL树、红黑树一样,内部节点和叶子节点都可以存储数据记录;而B+树只在叶子节点存储实际数据,非叶子节点仅作为索引使用。
-
范围查询和顺序扫描效率:B+树的所有数据记录都存储在叶子节点中,并且这些叶子节点通过链表连接,因此在进行范围查询和顺序扫描时效率更高。
-
磁盘I/O效率:B树和B+树设计之初就是为了优化磁盘I/O操作,它们可以减少磁盘访问次数,适用于大型数据集的存储和检索。
-
内存占用:AVL树因为需要频繁调整结构,所以在内存管理上有较高的开销;相比之下,红黑树由于旋转次数较少,内存占用相对较低。B+树由于只在叶子节点存储数据,其内存利用率通常优于B树。
3. 应用场景的区别
3.1 AVL树的应用
- 严格平衡需求:适用于需要严格平衡的场景,如某些特定的实时系统或嵌入式系统。
- 频繁查找:由于严格的平衡性,查找操作非常高效,适用于查找频率高的场景。
3.2 红黑树的应用
- 综合性能:红黑树在插入、删除和查找之间取得了较好的平衡,适合大多数通用场景。
- 标准库实现:C++标准库中的
std::map和std::set通常使用红黑树实现。
3.3 B树的应用
- 文件系统:如Linux的ext3/ext4文件系统。
- 数据库索引:如MySQL的InnoDB存储引擎,适合需要高效磁盘访问的场景。
3.4 B+树的应用
- 数据库索引:如MySQL的MyISAM存储引擎,特别适合范围查询和顺序扫描。
- 文件系统:如NTFS文件系统。
- 范围查询和顺序扫描:B+树更适合这些操作,因为所有数据记录都存储在叶子节点中,并且叶子节点通过链表连接。
4. 结论
AVL树、红黑树、B树和B+树各有其独特的优势和适用场景。选择哪种树取决于具体的应用需求:
- AVL树:适用于需要严格平衡和高效查找的场景。
- 红黑树:适用于综合性能要求较高的通用场景。
- B树:适用于需要高效磁盘访问的文件系统和数据库索引。
- B+树:适用于需要高效范围查询和顺序扫描的场景,特别是在数据库和文件系统中表现优异。
相关文章:
四大自平衡树对比:AVL树、红黑树、B树与B+树
AVL树、红黑树、B树和B树的对比与应用场景 树系列相关文章(置顶) 1、从链表到平衡树:二叉查找树的退化与优化 2、自平衡二叉查找树:如何让二叉查找树始终保持高效 3、AVL树入门:理解自平衡二叉查找树的基础 4、红黑树全…...
BUUCTF Pwn ciscn_2019_es_2 WP
1.下载 checksec 用IDA32打开 定位main函数 发现了个假的后门函数: 看看vul函数: 使用read读取 想到栈溢出 但是只有48个 只能覆盖EBP和返回地址 长度不够构造 所以使用栈迁移: 栈迁移需要用到leave ret 使用ROPgadget找地址: …...
MongoDb-mongosh-登录
本地登录 mongosh --username root --password xxx 参考:Connect to a Deployment - MongoDB Shell...
C语言day3:shell脚本
一、作业题3 使用数组求出当前目录下.sh文件的个数 二、作业题4 使用数组求家目录下文件的个数 三、思维导图...
微信小程序Uniapp
使用命令行创建项目(vuets) npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project然后用HBX打开项目 再安装依赖 npm i 再运行开发版本,生成dist目录 pnpm dev:mp-weixin 注意要设置APPid 再用微信小程序打开...
mongoTemplate的复杂组装条件查询
mongoTemplate不像SQL那么灵活,组装条件较为复杂。 如下演示了查询类似于 AND name ‘张三’ OR age 12 NOT birthday > 2024-12-31 这类结构的代码示例。 脑子里的范围图: 所有的AND锁定一个范围,再跟所有的OR组成的范围取并集&#…...
httpslocalhostindex 配置的nginx,一刷新就报404了
当你的Nginx配置导致页面刷新时报404错误时,通常是由于以下几个原因造成的: 静态文件路径配置错误:Nginx没有正确地指向静态文件的目录。前端路由问题:如果是SPA(单页应用),刷新页面时Nginx没有…...
pandas删除值全部为0的整行和整列,还有0.0,0.000000也要删除
在 Pandas 中,如果需要删除全部为 0 的行或列,可以通过 .all() 方法来判断行或列是否所有元素都为 0,然后删除这些行或列。 代码示例 示例数据: import pandas as pd# 示例数据 data {A: [0, 2, 0, 4],B: [0, 0, 0, 0],C: [0, …...
IO Virtualization with Virtio.part 1 [十二]
久等了各位! 本篇开始讲解 IO 虚拟化中的 virtio,我会以 Linux 的 IIC 驱动为例,从 IIC 驱动的非虚拟化实现,到 IIC 驱动的半虚拟化实现,再到最后 X-Hyper 中如何通过 virtio 来实现前后端联系,一步步把 v…...
ShardingSphere-Proxy分表场景:go测试案例
接续上篇文章《ShardingSphere-Proxy分表场景测试案例》 go测试用例: package mainimport ("fmt""math/rand""time""github.com/bwmarrin/snowflake""gorm.io/driver/mysql""gorm.io/gorm""gor…...
OpenStack系列第四篇:云平台基础功能与操作(Dashboard)
文章目录 1. 镜像(Image)添加镜像查看镜像删除镜像 2. 卷(Volume)创建卷查看卷删除卷 3. 网络(虚拟网络)创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对(…...
ESP32 I2S音频总线学习笔记(一):初识I2S通信与配置基础
文章目录 简介为什么需要I2S?关于音频信号采样率分辨率音频声道 怎样使用I2S传输音频?位时钟BCLK字时钟WS串行数据SD I2S传输模型I2S通信格式I2S格式左对齐格式右对齐格式 i2s基本配置i2s 底层API加载I2S驱动设置I2S使用的引脚I2S读取数据I2S发送数据卸载…...
25上半年软考高级系统分析师易混淆知识点
第1章 系统工程与信息系统基础 易混淆点1:系统工程生命周期与信息系统的生命周期 1、系统工程生命周期阶段 探索性研究→概念阶段→开发阶段→生产阶段→使用阶段→保障阶段→退役阶段 2、信息系统的生命周期 产生阶段→开发阶段(单个系统开发&…...
采集JSON解析错误的修复
两段采集来的JSON格式: 一: {"hwgOnlineId":"554312", "jiwuChatId":"", "phoneCategoryId":"20006", "cuxiaoSeq":{voucherTitle:1,lh 二: {"pic":&q…...
Java中实现对象的深拷贝(Deep Copy)
在Java中实现对象的深拷贝(Deep Copy)意味着创建一个对象的副本,使得原对象和副本对象完全分离,对副本对象的任何修改都不会影响到原对象。以下是几种实现深拷贝的方法: 1. 手动实现深拷贝 对于自定义类,…...
位置编码-APE
Transformer 中的绝对位置编码 (以下由gpt 生成) Transformer 的绝对位置编码(Absolute Position Encoding, APE)是用于对序列数据中的位置信息进行建模的一种方法。在 Transformer 的架构中,输入数据(如句…...
MySQL有哪些锁?
1.MySQL有哪些锁? 全局锁表级锁 表锁元数据锁意向锁 行级锁 记录锁间隙锁临键锁临时意向锁 我了解的是MySQL的锁可以分为全局锁、表级锁、行级锁。 我比较熟悉的是表级锁和行级锁,如果我们对表结构进行修改时,MySQL就会对这个表结构加一个…...
Everything实现,快速搜索文件
最近编写NTFS文件实时搜索工具, 类似 Everything 这样, 翻阅了很多博客, 结果大致如下: 1.分析比较肤浅, 采用USN日志枚举来获取文件记录 速度一言难尽, 因为日志枚举的是全盘所有文件的所有日志, 记录比文件记录还多, 速度当然很慢, 还有的甚至于是 使用 DeviceIoControl 函数…...
[硬件] DELL BIOS 相关注意事项
前言 前段时间重装系统. DELL BIOS属实资料少, 又难用. 这里给出相关的注意事项, 并且配上图片. BIOS相关注意事项 进入BIOS ESC/F2/ F12. 都可以进入BIOS, 当进U盘的入Win PE系统时, 使用F12 效果更佳. 关闭安全模式 切换到Boot Configuration选项,将Secure Boot选项off选…...
Rocky Linux 下安装Liboffice
Rocky Linux下安装Liboffice。 Step1: 在桌面,单击击键盘的Window键,点击出现的白色software按钮图标; Step2: 输入lib,即可自动跳出libre Office, 进行安装; Step3: Have fun with Rocky Linux....
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
