一、核心概念与性质对比

1. B树(Balanced Tree)
  • 定位:多路平衡搜索树,专为磁盘存储优化

  • 核心性质

    • 每个节点存储 k-1个键值k个子节点指针m/2 ≤ k ≤ m,m为阶数)

    • 所有叶子节点位于同一层(高度平衡)

    • 节点内键值有序排列,左子树键值均小于父节点,右子树大于父节点

  • 优势

    • 减少磁盘I/O:单节点存储大量键值,树高显著降低(3-4层可存百万数据)

    • 局部修改:插入/删除仅影响局部节点,避免全局调整1

2. B+树(B+ Tree)
  • 定位:B树变种,数据库索引标准结构

  • 核心性质

    • 非叶节点仅存键值(无数据指针),叶节点存数据并形成双向链表

    • 非叶节点的键值在叶节点中重复出现(叶节点含所有数据)

  • 优势

    • 范围查询高效:叶节点链表支持顺序遍历(如SQL的BETWEEN

    • 磁盘利用率更高:非叶节点容纳更多键值,进一步降低树高

    • 查询稳定性:所有查询路径长度相同(均到叶节点)

3. 红黑树(Red-Black Tree)
  • 定位:自平衡二叉搜索树,内存操作优化

  • 核心性质

    • 颜色约束:节点红/黑交替,根和叶(NIL)为黑,无连续红节点

    • 黑高平衡:任意节点到叶节点的路径含相同黑节点数

  • 优势

    • 近似平衡:最长路径≤2倍最短路径,保证O(log n)操作

    • 低维护成本:插入/删除最多3次旋转(远少于AVL树)

4. 三树对比总结
特性B树B+树红黑树
结构多叉,数据存所有节点多叉,数据仅存叶子二叉,颜色标记平衡
树高极低(3-4层百万级)更低(同数据量更矮)较高(约2logN)
磁盘I/O优化优秀最优(索引更紧凑)
范围查询需中序遍历叶子链表直接遍历需中序遍历
典型应用文件系统MySQL索引Java TreeMap

二、操作复杂度与设计逻辑

1. B/B+树:
  • 减少I/O次数

    • 节点大小 ≈ 磁盘页(如4KB),单次I/O加载数百键值

    • 二叉查找树需O(log n)次I/O,B树仅需O(log_m n)(m为分支因子)

  • 插入/删除逻辑

    • 节点分裂:键值超限 → 中位数提升至父节点,分裂两子节点

    • 节点合并:键值不足 → 向兄弟节点借键或与父节点合并

2. 红黑树:
  • 旋转与变色策略

    • 插入5种Case:如叔节点红则变色;叔节点黑则旋转(左旋/右旋)

    • 删除7种Case:根据兄弟节点颜色调整(如兄弟红则旋转+变色)

  • 平衡代价

    • 查询:O(log n)(常数比AVL大)

    • 插入/删除:旋转次数O(1),优于AVL树的O(log n)


三、应用场景解析

1. B树:文件系统
  • 代表:NTFS、Ext4

  • 原因

    • 文件块存储分散,B树局部修改特性减少磁盘写入

    • 目录结构需快速定位分散存储的文件块

2. B+树:数据库索引
  • 代表:MySQL InnoDB

  • 原因

    • 范围查询高效:WHERE id BETWEEN 100 AND 200 → 叶节点链表遍历

    • 聚簇索引优化:叶节点直接存行数据,避免二次查找

3. 红黑树:内存数据结构
  • 代表:Java TreeMap、C++ std::map

  • 原因

    • 插入/删除频繁(如HashMap冲突链转树)

    • 避免AVL树严格平衡的高维护成本


四、常见问题总结

Q1:数据库为什么用B+树不用红黑树?

A:核心在于磁盘I/O优化范围查询支持

  • I/O次数:红黑树树高约2logN,百万数据需20次I/O;B+树树高仅3-4层(节点存数百键)。

  • 范围查询:B+树叶节点链表直接遍历;红黑树需中序遍历(回溯栈易溢出)。

  • 数据局部性:B+树非叶节点纯索引,单页缓存更多键值,缩小查找范围。

Q2:B树和B+树区别?

A:聚焦数据存储位置叶子结构

  • 数据存储:B树所有节点存数据;B+树数据仅存叶子,非叶节点为索引。

  • 叶子链接:B+树叶节点双向链表支持顺序访问;B树叶节点独立。

  • 查询稳定性:B树查询可能在非叶节点结束;B+树必须到叶子(稳定O(log n))。

Q3:红黑树如何保证平衡?

A:通过颜色约束旋转策略

  • 黑高平衡:任意路径黑节点数相同,确保最长路径≤2倍最短路径。

  • 旋转Case:插入分5种情况(如叔节点红则变色,黑则旋转);删除分7种(兄弟节点颜色决定操作)。

  • 低开销:插入/删除最多3次旋转(AVL可能需O(log n)次)。

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

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

相关文章

Spring AI 使用阿里百炼平台实现流式对话:基于 SSE 的实践

Spring AI阿里百炼平台实现流式对话:基于 SSE 的实践指南 在大模型应用开发中,流式对话是提升用户体验的关键特性。本文将详细介绍如何利用 Spring AI 结合 Spring Boot,基于 SSE(Server-Sent Events)协议实现高效的流…

Ubuntu lamp

Ubuntu lamp 前言 在Ubuntu安装lamp架构 我们了解到 lamp是完整的架构 我们前面了解到了 集合了Linux系统 apache MySQL 和PHP语言的完整架构 我们前面说了Centos7中编译安装 lamp 那么 我们去说一下在Ubuntu中安装 ‍ ‍ 安装apache2 ‍ apt直接安装apache2 apt -y install a…

开源向量LLM - Qwen3-Embedding

1 Qwen3-Embedding介绍 Qwen3-Embedding遵循 Apache 2.0 许可证,模型大小从0.6B到8B,支持32k长文本编码。 Model TypeModelsSizeLayersSequence LengthEmbedding DimensionMRL SupportInstruction AwareText EmbeddingQwen3-Embedding-0.6B0.6B2832K10…

云计算服务模式全解析:IaaS、PaaS、SaaS与DaaS的区别与应用

一、云计算概述 云计算是一种通过互联网提供计算服务的模式,其核心特点是输入/输出与计算不在同一主机上。一个完整的云计算环境由云端(计算设备)、计算机网络和终端(输入/输出设备)三部分组成,即"云…

qwen 多模态 预训练流程步骤详细介绍

Qwen(通义千问)是阿里云推出的大语言模型,其多模态预训练是一个复杂且专业的过程,虽然官方没有完全公开全部细节, 但从多模态大模型通用的预训练逻辑上,一般包含以下主要步骤: 数据准备 多模态数…

FastDDS (SharedMemory)

SharedMemSegment Start // Fast-DDS/src/cpp/utils/shared_memory/SharedMemSegment.hppclass SharedSegmentBase {内部类 start class Id { public:typedef UUID<8> type;Id(); // 返回共享内存变量的IDId(const Id& other); // 设置共享内存变量的IDvoid g…

sqli-labs:Less-5关卡详细解析

1. 思路&#x1f680; 本关的SQL语句为&#xff1a; $sql"SELECT * FROM users WHERE id$id LIMIT 0,1";注入类型&#xff1a;字符串型&#xff08;单引号包裹&#xff09;提示&#xff1a;参数id需以闭合 但有意思的是&#xff0c;php代码的输出语句不是如下这种…

标准项目-----网页五子棋(4)-----游戏大厅+匹配+房间代码

页面实现 hall.html <!DOCTYPE html> <html lang"ch"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>游戏大厅</title><l…

MySQL分析步

MySQL分析 -- 库名 set dbName bsa_crmeb_bak; -- 表名 set tableName bsa_crmeb_bak;-- 查看bsa_crmeb_bak数据库基本信息 SELECTSCHEMA_NAME AS 数据库名,DEFAULT_CHARACTER_SET_NAME AS 字符集,DEFAULT_COLLATION_NAME AS 排序规则 FROM information_schema.SCHEMATA WHER…

工程化(二):为什么你的下一个项目应该使用Monorepo?(pnpm / Lerna实战)

工程化(二)&#xff1a;为什么你的下一个项目应该使用Monorepo&#xff1f;&#xff08;pnpm / Lerna实战&#xff09; 引子&#xff1a;前端项目的“孤岛困境” 随着你的项目或团队不断成长&#xff0c;一个棘手的问题会逐渐浮现&#xff1a;代码该如何组织&#xff1f; 最…

应用药品注册证识别技术,为医药行业的合规、高效与创新发展提供核心驱动力

在医药行业的庞杂数据海洋中&#xff0c;药品注册证&#xff08;如中国的“国药准字”、美国的NDA/ANDA批号&#xff09;是药品合法上市流通的“身份证”。面对海量的证书审核、录入与验证需求&#xff0c;传统人工处理方式不仅效率低下、成本高昂&#xff0c;更易因疲劳导致差…

Spring Boot 2.1.18 集成 Elasticsearch 6.6.2 实战指南

Spring Boot 2.1.18 集成 Elasticsearch 6.6.2 实战指南前言&#xff1a;一. JAVA客户端对比二. 导入数据2.1 分析创建索引2.2 代码实现三. ElasticSearch 查询3.1 matchAll 查询3.2 term查询3.3 match查询3.4 模糊查询3.5 范围查询3.6 字符串查询3.7 布尔查询3.8 分页与排序3.…

向量投影计算,举例说明

向量投影计算,举例说明 向量投影是指将一个向量(设为向量b\mathbf{b}b)投射到另一个向量(设为向量a\mathbf{a}a)所在直线上,得到一个与a\mathbf{a}

如何在技术世界中保持清醒和高效

“抽象泄露&#xff0c;是存在的&#xff0c;但你需要了解多少&#xff0c;需要理解多深&#xff0c;这一点是因人而异的&#xff0c;绝对不是别人能够建议的。每个人只会站在自己的立场上去建议别人怎么做。”在写下这句话时&#xff0c;身为一个技术开发者&#xff0c;我似乎…

服装公司数字化转型如何做?

WL贸易集团公司&#xff08;以下简称WL&#xff09;自2012年成立以来&#xff0c;在十余年的发展历程中不断蜕变与升级。公司始终秉持“时尚与品质优先”的核心经营理念&#xff0c;通过严格执行高标准、严要求&#xff0c;牢牢把握产品品质与交货周期两大关键&#xff0c;赢得…

GM DC Monitor 之 银河麒麟 Docker 部署安装手册

官方网站&#xff1a;www.gm-monitor.com 本手册以银河麒麟为例&#xff0c;介绍在 Linux 系统上安装和配置DOCKER服务的详细步骤 一、以root用户执行以下操作命令 1、环境优化 modprobe br_netfilter cat <<EOF > /etc/sysctl.d/docker.conf net.bridge.bridge-n…

网络编程接口bind学习

1、概述下面2个问题你会怎么回答呢?1、bind如果绑定0号端口&#xff0c;可以工作么&#xff0c;如果能正常工作&#xff0c;绑定的什么端口 2、客户端可以调用bind么2、解析2.1、bind如果绑定0号端口&#xff0c;可以工作么&#xff0c;如果能正常工作&#xff0c;绑定的什么端…

FinOps X 2025 核心发布:AI 时代下的 FinOps 转型

2025年&#xff0c;人工智能技术的突破性发展正深刻重塑商业与技术格局&#xff0c;智能技术已成为各领域创新的核心驱动力。在此背景下&#xff0c;FinOps X 2025 围绕 AI 技术对财务运营&#xff08;FinOps&#xff09;的革新作用展开深度探讨&#xff0c;重点呈现了以下关键…

使用Min-Max进行数据特征标准化

在数据处理过程中&#xff0c;标准化是非常重要的步骤之一&#xff0c;特别是在机器学习和数据分析中。Min-Max标准化&#xff08;也称为归一化&#xff09;是一种常用的数据标准化方法&#xff0c;它通过将数据缩放到一个指定的范围&#xff08;通常是0到1之间&#xff09;&am…

【Dart 教程系列第 51 篇】Iterable 中 reduce 函数的用法

这是【Dart 教程系列第 51 篇】,如果觉得有用的话,欢迎关注专栏。 博文当前所用 Dart SDK:3.5.4 文章目录 一:reduce 作用 二:举例说明 1:求和 2:查找最大/最小值 3:字符串拼接 4:自定义对象合并 三:注意事项 一:reduce 作用 reduce 是 Iterable 的一个方法,用于…