沉梦听雨的编程指南 沉梦听雨的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • 网络

  • 操作系统

  • 数据结构与算法

    • 数据结构基础小结
    • 基础篇

      • 学前须知
      • 复杂度
      • 动态数组
      • 链表
      • 栈
      • 队列
      • 二叉树
      • 二叉搜索树
      • AVL树
      • B树
        • 初识 B树
        • m 阶 B树 的性质(m>=2)
        • B树 VS 二叉搜索树
        • 搜索
        • 添加
          • 上溢现象
          • 上溢的解决
          • 插入元素分析
        • 删除
          • 删除 - 叶子节点
          • 删除 - 非叶子节点
          • 下溢现象
          • 下溢的解决
        • 4阶B树
      • 红黑树
      • 集合
      • 映射
      • 哈希表
      • 二叉堆
      • 优先级队列
      • 哈夫曼树
      • Tire
      • 总结
    • 力扣篇

  • 计算机基础
  • 数据结构与算法
  • 基础篇
沉梦听雨
2023-11-02
目录

B树

# B树

# 初识 B树

B树 是一种平衡的多路搜索树,多用于文件系统、数据库的实现

特点

  • 1 个节点可以存储超过 2 个元素、可以拥有超过 2 个子节点
  • 拥有二叉搜索树的一些性质(左右大小关系)
  • 平衡,每个节点的所有子树高度一致
  • 比较矮

# m 阶 B树 的性质(m>=2)

m 阶的意思:就是意味着这棵 B树 最多有 m 个子节点,每个节点最多存储 m-1 个元素。

1、假设一个节点存储的元素个数为 x

  • 根节点: 1 <= x <= m - 1
  • 非根节点: ┌ m/2 ┐ - 1 < x < m - 1
  • ┌ m/2 ┐ -- 是向上取整的意思

2、如果有子节点,子节点个数为 y = x + 1

  • 根节点: 2 <= y <= m
  • 非根节点: ┌ m/2 ┐ <= y <= m
    • 比如 m = 3,2 <= y <= 3,因此可以称为 (2,3) 树、2-3 树
    • 比如 m = 4,2 <= y <= 4,因此可以称为 (2,4) 树、2-3-4 树
    • 比如 m = 5,3 <= y <= 5,因此可以称为 (3,5) 树
    • 比如 m = 6,3 <= y <= 6,因此可以称为 (3,6) 树
    • 比如 m = 7,4 <= y <= 7,因此可以称为 (4,7) 树

4 阶 B树 如下图所示

image

数据库实现中一般用【几阶B树】?

一般是 200 ~ 300

思考:如果 m = 2,那【B树】是什么样子的?

# B树 VS 二叉搜索树

  1. B树 和 二又搜索树,在逻辑上是等价的(只不过是【B树】一个节点融合了多个元素)

  2. 多代节点合并,可以获得一个超级节点

    • 2 代合并的超级节点,最多拥有 4 个子节点(至少是 4阶B树)
    • 3 代合并的超级节点,最多拥有 8 个子节点(至少是 8阶B树)
    • n 代合并的超级节点,最多拥有 (2^n) 个子节点(至少是 2^n 阶B树)
  3. m阶B树,最多需要 log2(m) 代合并

二叉搜索树

image

B树

image

# 搜索

  1. 先在节点内部从小到大开始搜索
  2. 元素如果命中,搜索结束
  3. 如果未命中,再去对应的子节点中搜索元素,重复步骤 1

# 添加

# 上溢现象

当在【B树】中添加元素时,可能会导致上溢(Overflow)情况,即节点中的关键字个数超过了节点的容量。

# 上溢的解决

  1. 上溢节点的元素个数必然等于 m。

  2. 假设上溢节点最中间元素的位置为 k

    • 将 k 位置的元素向上与父节点合并
    • 将 [0, k-1] 和 [k+1, m-1] 位置的元素分裂成 2 个子节点
      • 这 2 个子节点的元素个数,必然都不会低于最低限制 (┌ m/2 ┐ - 1)
  3. 一次分裂完毕后,有可能导致父节点上溢,依然按照上述方法解决

    • 最极端的情况,有可能一直分裂到根节点

具体如下图所示

image

# 插入元素分析

image

# 删除

# 删除 - 叶子节点

假如需要删除的元素在叶子节点中,那么直接删除即可。

# 删除 - 非叶子节点

假如需要删除的元素在非叶子节点中

  1. 先找到前驱或后继元素,覆盖所需删除元素的值

  2. 再把前驱或后继元素删除

如下图示:

image

  • 非叶子节点的前驱或后继元素,必定在叶子节点中
  • 所以这里的删除前驱或后继元素,就是最开始提到的情况: 删除的元素在叶子节点中

# 下溢现象

  • 叶子节点被删掉一个元素后,元素个数可能会低于最低限制(┌ m/2 ┐ - 1)
  • 这种现象称为:下溢(underflow)

# 下溢的解决

  1. 下溢节点的元素数量必然等于 ┌ m/2 ┐ - 2

  2. 如果下溢节点临近的兄弟节点,有至少 ┌ m/2 ┐ 个元素,可以向其借一个元素

    • 将父节点的元素 b 插入到下溢节点的 0 位置(最小位置)
    • 用兄弟节点的元素 a (最大的元素) 替代父节点的元素 b
    • 这种操作其实就是:旋转

    image-20231103180147476

  3. 如果下溢节点临近的兄弟节点,只有 ┌ m/2 ┐ - 1 个元素

    • 将父节点的元素 b 挪下来跟左右子节点进行合并

    • 合并后的节点元素个数等于 ┌ m/2 ┐ + ┌ m/2 ┐ - 2,不超过 m - 1

    • 这个操作可能会导致父节点下溢,依然按照上述方法解决,下溢现象可能会一直往上传播,最坏的情况是一直到根节点下溢

image

根节点下溢怎么办?

这个时候根节点必然是:

  • 根节点所有东西跟它底下子节点合并成新的根节点。
  • 此时树会变矮,少掉一层

# 4阶B树

4阶B树的性质

  1. 所有节点能存储的元素个数 x: 1 <= x <= 3
  2. 所有非叶子节点的子节点个数 y: 2 <= y <= 4

思考

从 1 添加到 22,从 1 删除到 22 的情况。

可通过该网站查看流程细节:B-Tree Visualization (usfca.edu) (opens new window)

上次更新: 2024/9/25 11:16:13
AVL树
红黑树

← AVL树 红黑树→

Theme by Vdoing | Copyright © 2023-2025 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式