数据库系统概论__B+树的实现

第一部分:B+树的定义

引用维基百科上关于B+树的定义。B+树关键字个数等于孩子个数-1;这一点是和B树等价的。如下图所示的就是一个4阶B+树。除此之外,B+树还要满足下列条件:

(1)B中包含两种类型的节点,内部节点(也称之为索引节点)和叶子节点,根节点本身可以是内部结点,也可以是叶子节点。根节点至少有一个关键字key。

(2)B+树的内部结点不用于保存数据,只用于索引,所有记录都保存在叶子节点里面。

(3)m阶的B+树表示了内部结点最多有m-1个关键字。阶数同时限制了叶子节点最多存储m-1个记录。(内部最少有Mah.ceil(m/2.0)-1个关键字)

(4)部结点中的key都按照从小到大的顺序排列,对于内部结点中的一个key,左树中的所有key都小于它,右子树中的key都大于等于。叶子结点中的记录也按照key的大小排列。

(5)每个叶子结点都存有相邻叶子结点的指针,叶子结点本身依关键字的大小自小而大顺序链接。

第二部分:B+树的搜索

 

第三部分:B+树的插入

(1)若是为空树,则创建一个叶子节点,然后将记录插入其中。此时这个叶子节点也是根节点,插入结束。

(2)针对叶子类型结点:根据key值找到叶子节点,向这个叶子插入记录。插入后,若当前节点key的个数小于等于m-1则插入结束。否则将这个叶子节点分成左右两个叶子节点。左叶子节点包含前m/2个记录,右结点包含剩下的记录。中间节点记录的key进位到父结点中(这里的中间节点 如果是5阶的B+树,则有将第三个记录key上移 如果key =6 的话 无论是移动第三个 还是第四个是等价的,我们这里选择的是移动第三个(Math.ceil(m/2.0))),进位到父结点的key左孩子指针指向左结点,右孩子指针指向右结点。将当前节点的指针指向父节点,然后执行第3步。

(3)针对索引类型的结点:若当前节点key的个数小于等于m-1,则插入结束,否则,将这个索引节点分裂成两个索引结点,左索引结点包含前面(m-1)/2个key,右边包含m-(m-1)/2个key 个key,将第Math.ceil(m/2.0)个key进位到父结点中,进位到父结点的key左孩子指向左结点, 进位到父结点的key右孩子指向右结点。将当前结点的指针指向父结点,然后重复第3步([*******]比如m=5 则将第三个节点放置于父结点之上。m =6的时候,则将第三个节点放置于父结点之上。

示例:5阶B数的插入操作 5阶B树中间节点至少有两个关键字 最多有4个关键字

(1)插入 5,8, 10,16 15

调整:

(2)插入17 18

调整:

 

(3)插入6 9 19 20 21 22 

a)插入6 9  19 20

调整:

b)插入21 22

调整:

 (4)插入7

调整:

 当前结点的关键字个数满足条件,插入结束。

第四部分:B+树的删除

如果叶子中没有相应的key 则删除失败 否则进行下面的步骤

(1)删除叶子节点中对应的key 删除后若节点的个数大于等于Math.ceil(m/2.0)-1,删除操作结束,否则操作进行第2步

(2)若兄弟节点key有富余(大于Math.ceil(m/2.0)-1)向兄弟节点借一个记录,同时用借到的key替换父结点中的key(指的是当前节点和兄弟节点共同的父结点),删除结束。[这个地方有疑问,是这样的过程:首先删除节点向父节点借一个节点,使当前的节点满足B树的条件,然后再从富余的兄弟节点拿出一个key给父亲 这样的话 依然满足B树的条件 这种想法是错误的 因为非页子节点中只有索引]

(3)若兄弟节点没有富余的key,那么则把当前节点和兄弟节点合并成为一个新的叶子节点,并删除父节点中的key(这个时候,父节点中的这个key两边的孩子指针就变成了一个指针,正好指向新的叶子节点),将当前节点指向父节点(索引节点),执行第四步(第4步以后的操作和B树就完全一样了,主要是为了更新索引结点)

(4)若索引结点的key的个数大于等于Math.ceil(m/2.0) – 1,则删除操作结束。否则执行第5步

(5)若兄弟结点有富余,父结点key下移,兄弟结点key上移,删除结束。否则执行第6步

(6)当前结点和兄弟结点及父结点下移key合并成一个新的结点。将当前结点指向父结点,重复第4步。

5阶B树的某些节点的删除操作

(1)初始状态

(2)删除22

 

 (3)删除15 

(4)删除 7

另一种做法

 

 (这里需要思考的问题是更新节点的时候是否需要更新索引,因为这个时候,索引对应的节点不一定存在了 )

https://www.cnblogs.com/nullzx/p/8729425.html

猜你喜欢

转载自blog.csdn.net/weixin_39804483/article/details/85156709