磁盘上的B树和B+树

376 阅读3分钟

简介

  B-树B+树树是数据库用来存储索引文件常用的数据结构,本章介绍常见的数据结构B-树B+树。并且会实现这两种数据结构的代码。

1.1 B-树B+树为何要存放在磁盘上?

  原因很简单因为如果放在内存当中那么断电之后,数据就消失了。无法达到数据持久化存储的需求。

1.2 为何不用二叉搜索树

  二叉搜索树没次寻址会排除 1/2 的数据,当数据量大的时候查找一个数据需要log n次才能找到对应的数据。然而在磁盘上索引是非常耗时的,故人们想到设计一种减少寻址次数的数据结构,多路分支二叉树。也就是B树。

B-树的性质

  B-树 的每个节点能够存储多少个数据节点,那么该B-树就是多少阶。
如下图所示是一棵 6B-树

image.png

一棵M阶的B-树有以下性质

  1. 每个节点至多有M棵子树。
  2. 若根节点不是叶子节点,则至少有2棵子树。
  3. 除根节点与叶子节点外,每个节点至少有ceil(M/2)个孩子。
  4. 所有的叶子节点在同一层。
  5. 每个非叶子节点由n个keyn+1个指针组成,其中ceil(M/2)-1] <= n <= M-1

B树的插入

  一棵B-树是怎样有一棵空树变成一棵丰满的树呢?接下来以一棵六叉B-树为例。   刚开始,树中一个节点都没有,那么直接插入即可。

image.png   但是一棵六叉B-树只能存储五个数据节点,此时若查如一个节点,则会超过节点的数量,这个时候,我们就要将中间节点向上分裂。字母FC大,说明应该插入到右树,也就是DE后面的位置。 image.png   如果不是根节点那又该如何分裂呢?比如下图插入字母I。由于C的右树满了,此时产生分裂。C变成CF。原来的树变成两棵树。最后再插入到F的右树中,也就是GHI的位置。那如果此时向上分裂的树因为多了一个节点之后也满了,那么该节点就在继续向上分裂。

image.png

B-树的查找

  查找就比较简单了,类似于二叉搜索树的查找,如果找到则返回。没找到,则判断其在哪个分支,然后递归到该分支去查找。

B-树的删除

  删除就比较麻烦了。

1

  如果当前需要删除的key位于非叶子结点上,则用后继key(这里的后继key均指后继记录的意思)覆盖要删除的key,然后在后继key所在的子支中删除该后继key。此时后继key一定位于叶子结点上,这个过程和二叉搜索树删除结点的方式类似。删除这个记录后执行第2步

2

  该结点key个数大于等于Math.ceil(m/2)-1,结束删除操作,否则执行第3步。

3

  如果兄弟结点key个数大于Math.ceil(m/2)-1,则父结点中的key下移到该结点,兄弟结点中的一个key上移,删除操作结束。

否则,将父结点中的key下移与当前结点及它的兄弟结点中的key合并,形成一个新的结点。原父结点中的key的两个孩子指针就变成了一个孩子指针,指向这个新结点。然后当前结点的指针指向父结点,重复上第2步。

有些结点它可能即有左兄弟,又有右兄弟,那么我们任意选择一个兄弟结点进行操作即可。

下面以5阶B树为例,介绍B树的删除操作,5阶B树中,结点最多有4个key,最少有2个key
假设我们要删除21,其在叶子节点,符合情况一 image.png

更多复杂的操作请看博客地址 :www.cnblogs.com/nullzx/p/87…