B树和B+树画图详解

B树系列


B树和B+树的出现是为了查询数据时减少磁盘的IO次数,我们知道平衡二叉查找树是一种查询速度很快的数据结构。它的时间复杂度为(logN),但是它由于是一个二叉树,所以树的高度相对于多叉树来讲是比较高的,所以为了平衡磁盘IO与时间复杂度直接的关系,我们引入了B树和B+树;

1. B树

在这里插入图片描述

上图为一个3-4树,或者叫4阶树,即一个节点最多存储3个key,一个节点最多有4个孩子(3+1);

在B树里,一个节点里面有多个key;

1. B树特点

  • 每个节点最多有m-1个关键字(可以存有的键值对);
  • 根节点最少可以只有一个关键字;
  • 非根节点至少有m / 2 个关键字;
  • 每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它;
  • 所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度都相同;
  • 每个节点都存有索引和数据,也就是对应的key和value;

所以得到结论:

  • 根节点的关键字数量范围:1 <= k <= m-1;
  • 非根节点的关键字数量范围:m/2 <= k <= m-1;

所以我们在描述一个B树的时候需要指定它的阶数,阶数表示了一个节点最多有多少个孩子节点,一般用 m 表示阶数;

2. B树的分裂过程:(插入)

分裂:高度是分裂出来的

  • 插入的时候永远在最下面的节点中进行插入(该在哪一块,从上往下找呗,因为这也是搜索树啊);
  • 中间的那个数往上走成为一个新的节点,将分为左和右;
    在这里插入图片描述

3. B树的删除操作

  • 如果删除的是叶子节点中的元素,且删除之后,那个叶子节点数还是大于m/2,这种情况直接删除即可;

  • 删除非叶子节点中的元素,如下图:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    在这里插入图片描述
    要删除22这个节点,对于非叶子节点的删除,我们要将后继key覆盖要删除的key,然后在后继key所在的子支中删除这个key,结果如下:
    在这里插入图片描述

    此时发现26所在节点只有一个元素了,小于m/2,不符合B树特点,如果它的兄弟节点的元素大于m/2,此时就要向它的兄弟节点借取,具体方法就是先向父节点借取,然后兄弟节点再给父节点补充,如下图:
    在这里插入图片描述
    在这里插入图片描述

2. B+树

1. B树和B+树的相同点:

  • 根节点至少一个元素;
  • 非根节点的元素范围:m/2 <= k <=m-1

2. B树和B+树的不同点

  • B+树有两种类型的节点:内部节点(也称索引节点)和叶子节点
    • 内部节点就是非叶子节点,内部节点不存储数据,只存储索引,数据都存储在叶子节点;
  • 内部节点中的key都按照从小到大的顺序排列,对于内部节点中的一个key,左树种所有key都小于它,右树中所有key都大于等于它,叶子节点中的记录也按照key的大小排列;
  • 每个叶子节点都存有相邻叶子节点的指针,叶子节点本身依关键字的大小自小而大顺序链接;
  • 父节点存有右孩子的第一个元素的索引

下面看一个B+树的图片来感受感受:
在这里插入图片描述

3. B+树的插入操作

以下面的这颗5阶的B+树(m为5)为例,5阶B+树的节点最多4个元素,最少2个元素;

  • 插入5,10,15,20
    在这里插入图片描述
  • 然后插入25,此时元素个数大于m-1,需要分裂:
    在这里插入图片描述
  • 接着插入26,30,继续分裂:
    在这里插入图片描述

3. B树和B+树总结⭐

B+树相对于B树有一些自己的优势,可以归结为下面几点:

  • 单一节点存储的元素更多,使得查询的IO次数更少,所以也就使得它更适合作为数据库MySQL的底层数据结构;
  • 所有的查询都要查找到叶子节点,查询性能是稳定的,而B树,每个节点都可以查找到数据,所以不稳定;
  • 所有的叶子节点形成了一个有序链表,更加便于查找;

4. 搜索树总结

模型:

  • key模型(Set)
  • Map模型

哈希表和搜索树的比较:

  • 哈希表的时间复杂度为O(1)
  • 搜索树不会遭到恶意冲突
  • 搜索树的中序是有序的
    • 这个优点比如在数据库的ORDER BY语句中,假如使用了索引,则直接返回其中序遍历索引即可;
  • hash表只支持等值查询,不易于范围查询,而搜索树实现范围查询就很容易;

B-树、B+树、B树的区别(B只做了解即可)

数据库中的索引就是在原有的数据之外又建立了一个B系列树(MySQL中InnoDB为B+树);

数据库也支持hash索引,这种索引只用于等值查询;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章