B树

  • m阶B树的性质
  • B树 vs 二叉搜索树
  • 搜索
  • 添加 – 上溢
    • 添加 – 上溢的解决(假设5阶)
  • 删除
    • 删除 – 叶子节点
    • 删除 – 非叶子节点
    • 删除 – 下溢
    • 删除 – 下溢的解决
  • 4阶B树

数据结构与算法笔记目录:《恋上数据结构》 笔记目录

想加深 Java 基础推荐看这个: Java 强化笔记目录

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

仔细观察B树,有什么眼前一亮的特点?

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



m阶B树的性质

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

  • 200 ~ 300

B树 vs 二叉搜索树

B树二叉搜索树,在逻辑上是等价的;

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

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

m 阶 B树,最多需要 log2m 代合并;

搜索

跟二叉搜索树的搜索类似:

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

添加 – 上溢

新添加的元素必定是添加到叶子节点:

插入 55:

插入 95:

再插入 98 呢?(假设这是一棵 4阶B树)

  • 最右下角的叶子节点的元素个数将超过限制
  • 这种现象可以称之为:上溢(overflow)

添加 – 上溢的解决(假设5阶)

上溢节点的元素个数必然等于 m;

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

  • 将 k 位置的元素向上与父节点合并
  • 将 [0, k - 1] 和 [k + 1, m - 1] 位置的元素分裂成 2 个子节点
    这 2 个子节点的元素个数,必然都不会低于最低限制(┌ m/2 ┐ − 1)

一次分裂完毕后,有可能导致父节点上溢,依然按照上述方法解决

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


添加示例:

插入 98:

插入 52:

插入 54:

删除

删除 – 叶子节点

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

删除 – 非叶子节点

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

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

例:删除 60

非叶子节点的前驱或后继元素,必定在叶子节点中

  • 所以这里的删除前驱或后继元素 ,就是最开始提到的情况:删除的元素在叶子节点中
  • 真正的删除元素都是发生在叶子节点中;

删除 – 下溢


删除 22?(假设这是一棵 5阶B树)

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

删除 – 下溢的解决

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

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

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

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

  • 将父节点的元素 b 挪下来跟左右子节点进行合并
  • 合并后的节点元素个数等于┌ m/2 ┐ + ┌ m/2 ┐ − 2,不超过 m − 1
  • 这个操作可能会导致父节点下溢,依然按照上述方法解决,下溢现象可能会一直往上传播

删除示例:

4阶B树

如果先学习 4 阶 B 树(2 - 3 - 4 树),将能更好地学习理解红黑树:

4阶B树的性质:

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

添加:从 1 添加到 22

《恋上数据结构第1季》B树相关推荐

  1. 《恋上数据结构第1季》二叉搜索树BST

    二叉搜索树(BinarySearchTree) BST 接口设计 BST 基础 添加元素: add() 删除元素: remove() 删除节点 – 叶子节点 删除节点 – 度为1的节点 删除节点 – ...

  2. 《恋上数据结构第1季》动态数组实现栈

    栈(Stack) 栈的应用 – 浏览器的前进和后退 栈的接口设计 动态数组实现栈 练习题 逆波兰表达式求值 有效的括号 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java ...

  3. 《恋上数据结构第1季》字典树 Trie

    字典树Trie Trie 简介 Trie 实现 接口设计 源码 测试 数据结构与算法笔记目录:<恋上数据结构> 笔记目录 想加深 Java 基础推荐看这个: Java 强化笔记目录 Tri ...

  4. 《恋上数据结构第1季》平衡二叉搜索树、AVL树

    AVL树 二叉搜索树缺点分析 改进二叉搜索树 平衡(Balance) 理想平衡 如何改进二叉搜索树? 平衡二叉搜索树(Balanced Binary Search Tree) AVL树 BST 对比 ...

  5. 《恋上数据结构第1季》二叉树代码实现

    二叉树(BinaryTree) BinaryTree 基础 遍历(先序.中序.后序.层次遍历) 先序遍历: preorder() 中序遍历: inorder() 后序遍历: postorder() 层 ...

  6. 《恋上数据结构第1季》二叉树基础、真二叉树、满二叉树、完全二叉树、二叉树的遍历(重点)

    二叉树(Binary Tree) 树(Tree)的基本概念 有序树.无序树.森林 二叉树(Binary Tree) 二叉树的性质 真二叉树(Proper Binary Tree) 满二叉树(Full ...

  7. 《恋上数据结构第1季》二叉堆原理及实现、最小堆解决 TOP K 问题

    二叉堆 BinaryHeap 堆(Heap) 堆的出现 堆简介 二叉堆(Binary Heap) 获取最大值 最大堆 - 添加 最大堆 - 添加优化 最大堆 - 删除 replace 最大堆 - 批量 ...

  8. 《恋上数据结构第1季》映射 TreeMap,HashMap,LinkedHashMap

    映射 Map Map的接口定义 Map.java 红黑树 RBTree 实现 TreeMap TreeMap 分析 哈希表实现 HashMap HashMap 升级为 LinkedHashMap 数据 ...

  9. 《恋上数据结构第1季》集合 ListSet、TreeSet、HashSet

    集合(Set) 集合的接口定义 双向链表 LinkedList 实现 ListSet 红黑树 RBTree 实现 TreeSet TreeMap 实现 TreeSet HashMap 实现 HashS ...

最新文章

  1. LUOGU P2764 最小路径覆盖问题 (最小路径点覆盖)
  2. 导购提成怎么算_only导购工资提成怎么算标准
  3. Ionic 用于构建惊人的移动应用程序的顶级开源框架
  4. DotnetSpider (二) Downloader的设置 Request自定义数据字典
  5. 树莓派安装CentOS
  6. 面试官问:malloc(0)时程序会返回什么?
  7. JS中的Map和Set实现映射对象
  8. 精简ICO图标可减小EXE程序文件大小
  9. JBOSS7 学习 一 只能127.0.0.1 访问控制台
  10. Java架构学习(三十三)ActivityMQ基础消息中间件概述异步与同步MQ作用MQ件通讯方式MQ应用场景ActivityMQ安装使用ActivityMQ的案例主题和订阅
  11. MyEclipse9.0 XJad的配置
  12. c语言so文件反编译,apk so文件反编译教程
  13. POJ 3207 解题报告
  14. AGI:走向通用人工智能的【生命学哲学科学】第一篇——生命、意识、五行、易经、量子
  15. 云计算——交换机基本原理与配置
  16. Mac 如何强制关机?
  17. 从0到1搭建一个自己的cli脚手架
  18. 数论 判断素数:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验
  19. 使用IntelliJ IDEA搭建kafka源码环境时遇到Output path错误解决办法
  20. 别人群里发优惠券是怎么来的_教你自己发优惠券?

热门文章

  1. 抖音打破了传统互联网的商业逻辑
  2. [leetcode]36. Valid Sudoku c语言
  3. android各版本市场占有率报告,你用的是哪个版本 Android系统报告:果冻豆市占率升至62%...
  4. 如何在SQL Server中实现错误处理
  5. SQL Server Always On可用性组中的数据同步
  6. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
  7. 【转】js获取当前日期时间“yyyy-MM-dd HH:MM:SS”
  8. Spring mvc框架下使用kaptcha生成验证码
  9. Error: Cannot Determine the location of the VS common tools folder
  10. oracle经典面试题以及解答