赞
踩
B+树是应数据所需而出现的一种B树的变形树。一棵m阶的B+树需要满足下列条件:
⌈m/2⌉~m
(而根节点:1~m
);而在B树中,每个节点(非根内部节点)的关键字个数n的范围为⌈m/2⌉-1~m-1
(根节点:1~m-1
)。B+树中的所有数据均保存在叶子结点,且根结点和内部结点均只是充当控制查找记录的媒介,并不代表数据本身,所有的内部结点元素都同时存在于子结点中,是子节点元素中是最大(或最小)元素。
例如在上图中的B+树中查找55这个关键字,步骤如下:
B+树的插入和B树十分相似,其插入规则如下:
举例:
(1) 插入关键字12,此时第一个叶子节点部分[10, 15]关键字的个数<m,可以直接插入:(紫色代表插入的元素)
(2) 插入95,需要插入到最后一个叶子节点部分[85, 91, 97]:
此时该节点的关键字个数大于m,需要进行分裂操作,并且父节点需要插入一个新的关键字:
(3) 插入40,需要插入到第二个叶子节点部分[21, 37, 44]:
此时该节点的关键字个数大于m,需要进行分裂操作,并且父节点需要插入一个新的关键字:
父节点插入新的关键字之后,关键字的个数大于m,也需要进行分裂:
(4)插入100,由于其值比最大值 97 还大,插入之后,从根结点到该结点经过的所有结点中的所有值都要由 97 改为 100。(橙色为修改之后的)
修改完最大值之后,在最后一个节点处插入100:
B+树的删除也和B树十分类似,它有下面几种情况:
举例:
(1)删除12,包含12的叶子节点的关键字个数为3,当删除12时,关键字个数仍然大于等于⌈m/2⌉,可以直接删除:
(2)删除97,97为整个B+树中元素最大的值,当删除这个元素时,需要修改从97的父节点到根节点中所有涉及到97的值,将其修改为第二大的元素值(在这个例子中第二大的元素为91):
(3)删除51,此时51所在的结点只有59一个元素,该节点的关键字个数小于⌈m/2⌉,而它的兄弟结点元素个数大于⌈m/2⌉,可以给该节点借一个:
此时第二个叶子节点中的最大关键字为37,因此需要修改其父节点的值:
(4)删除59,此时59所在结点的关键字个数小于⌈m/2⌉:
并且该结点的兄弟结点的个数都为⌈m/2⌉,无法给它借关键字,因此将该结点与兄弟结点进行合并,结点合并之后,需要注意修改祖先节点相关的值:
(5)删除63,此时63所在的结点关键字个数小于⌈m/2⌉,并且兄弟节点无法给该节点提供关键字,因此该节点和其兄弟结点进行合并:
此时从图中可以发现,合并后的结点的父节点应该删除72,这时父节点关键字的个数小于⌈m/2⌉:
并且此时91所在结点的兄弟节点无法给该节点提供关键字,因此该结点和兄弟结点合并,并且需要修改合并后的节点的父节点的关键字值,合并后的结点的关键字个数满足条件。
数据库索引
。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。