本文共 2506 字,大约阅读时间需要 8 分钟。
一、B 树
1、B 树的概念
- B 树,即
多路平衡查找树
。 - B 树中所有节点的孩子个数的最大值称为 B 树的阶。
2、B 树的定义
- 一棵 m 阶的 B 树或为空树,或者满足下列性质: 1)
树中每个节点至多有 m 棵子树
; 2)分支节点至少有两棵子树
; 3)根节点外的分支节点至少有 ⌈m/2⌉ 棵子树
; 4)所有非叶子节点的结构如下: 其中,Ki 为节点关键字,且以递增顺序排列,Pi 是指向子树根节点的指针,且 Pi-1 所指子树的所有节点的关键字均小于 Ki,而 Pi 所指的子树中的关键字都大于 Ki。 5)所有叶节点在同一层中,并且不带信息
。 - 一棵四阶 B 树形状如下:
3、重要结论
- 根据 B 树的性质可以得出如下重要结论: 1)
B 树是所有节点的平衡因子等于 0 的多路平衡查找树
; 2)节点的孩子个数为结点关键字数加一
; 3)根节点无关键字相当于没有子树,也即是空树;若根节点有关键字,则子树必大于两棵
; 4)根节点外的分支节点至少有 ⌈m/2⌉-1 个关键字,即有⌈m/2⌉ 棵子树
; 5)节点中关键字自左向右递增,关键字两侧均有指向子树的指针,左边指针所指子树的所有关键字均小于该关键字,右边指针所指的子树的关键字均大于该关键字
。 6)所有叶节点在最深一层,代表查找失败的位置
。
4、B 树的高度
B树中的大部分操作所需的磁盘存取次数与B树的高度成正比
。 - 对于任何一棵有 n >=1个关键字、高度为 h、阶数为 m 的B树: 1)当每个节点最多有 m 棵子树时,n<= (m-1)(1+m+m2+ … + mh-1)=mh - 1,故 h>=logm(n+1)。 2)当每个节点关键字数达到最少,则容纳同样多的关键字的 B 树的高度达到最大,此时 h<=log⌈m/2⌉((n+1)/2)+1。
- 一棵 3 阶 B 树共 8 个关键字,则 2<=h<=3.17.
5、B 树的查找
- 对一棵 B 树进行查找可分为两步:
第一步确定节点,第二步在节点内确定关键字
。 - 由于 B 树通常存储在磁盘上,故而第一步操作是在磁盘上进行,第二步操作是在内存中进行。
- 经过第一步确定节点后,在节点内的有序表进行比较,若查找成功,则按照对应的指针信息到所指子树上去查找;在子树上也是这两个步骤,直到找到对应关键字或到叶节点。若递归到了叶节点也没有找到对应的关键字,则说明关键字在 B 树中并不存在。
6、B 树的插入
6.1、定位
- 利用 B 树查找算法,找到插入关键字的
最低层中的某个非叶节点
,插入位置必须是最低层的某个非叶节点
。
6.2、插入
- 每个非失败节点的关键字个数满足(⌈m/2⌉+1, m-1),插入一个关键字后,结点关键字数小于 m,则可以直接插入;若插入后节点关键字数目大于 m-1,则必须对节点进行分裂。
- 分裂就是:
取一个新节点,在插入关键字的后的原节点,从中间位置( ⌈m/2⌉ )将其中的关键字分为两部分,左部分的关键字放在原节点,右部分的关键字放在新节点,中间位置(⌈m/2⌉)的关键字插入原节点的父节点,若父节点进行插入后也导致关键字数目超过上限,则继续进行分裂,直到根节点为止,此时 B 树高度增 1
。
7、B 树的删除
- B 树进行删除操作时,需满足
删除后的节点的中得关键字个数>= ⌈m/2⌉-1
,也就是可能需要进行节点的“合并”。删除可分为两种情形:删除的结点不在终端结点和在终端结点
。
7.1、删除的关键字不在终端结点
- 当要进行删除的关键字 k 不在终端结点,可以用
k 的前驱 p 来代替 k,然后在相应的结点中删除 p
,此时 p 必定落在某个终端结点中,于是就转换成了第二种情形。
7.2、删除的关键字在终端结点
- 此时又可分为三种情况: ①直接删除: 当要进行删除关键字操作的结点的
关键字个数大于 m/2 的最小整数
,则直接删除关键字。 ② 兄弟够借:若要执行关键字删除操作的结点的关键字个数恰好等于 m/2 的最小整数减一
,且该结点相邻的或左或右兄弟的关键字个数大于 m/2 的最小整数
,则可进行父子换位法
,即需要调整该节点、或左或右兄弟结点极其双亲结点
,以达到新的平衡。
③ 兄弟不够借:若要执行关键字删除的结点与其左右相邻兄弟结点的关键字个数都只是等于 m/2 的最小整数减一
,则将删除关键字后的结点与其或左或右兄弟以及双亲结点中的关键字进行合并。
- 合并过程中,双亲结点的关键字个数减一;若其双亲结点是
根节点且关键字个数减到了 0,则直接将根节点删除,合并后的新节点成为根
;若不是根节点,则双亲结点需要与其兄弟节点进行调整或合并操作,重复知道符合 B 树的要求。
二、B+ 树
1、定义
- B+ 树是为了满足数据库所需而出现的一种
B 树的变形树
。 - 一棵 m 阶 B+ 树必须是: ① 每个分支节点最多有 m 棵子树; ② 非叶根节点至少有两棵子树,其他每个分支节点至少有⌈m/2⌉ 棵子树; ③ 结点子树数目与关键字个数一致; ④ 叶节点包含全部关键字及指向相应记录的指针,叶节点中的关键字有序排列,相邻叶节点之间也是有序的; ⑤ 所有分支节点中仅包含它各个子节点中关键字的最大值及指向其子节点的指针。
2、与 B 树的差异
- B+ 树的主要差异主要体现在叶子节点的关键字、节点关键字个数与其子树数目的关系和节点关键字数目的上下限,具体如下: ① B+ 树中结点的关键字数目与结点子树一比一;B 树中 n 个关键字的结点可以有 n+1 棵子树; ② B+ 树的非根节点关键字数目:(⌈m/2⌉, m),根节点关键字数目:(1, m);B 树的非根结点的关键字数目:(⌈m/2⌉-1, m-1),根节点关键字数目:(1, m-1)。 ③ B+ 树的叶节点包含信息,所有非叶节点仅起到索引作用,非叶节点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有关键字对应记录的存储地址。 ④ B+ 树的叶子节点包含了全部关键字,即非叶节点的关键字也会在叶节点重复出现;B 树中,叶节点中的关键字不会与其他结点的关键字重复。
转载地址:http://uhqgn.baihongyu.com/