B-树

来源:互联网 发布:手机版root软件 编辑:程序博客网 时间:2024/06/06 10:31
 

1. B - 树的定义:

1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树,其定义如下:

一棵m阶的B-树满足下列条件:

⑴ 树中每个结点至多有m个孩子;

⑵ 除根结点和叶子结点外,其它每个结点至少有m/2个孩子;

⑶ 若根结点不是叶子结点,则至少有2个孩子;

⑷ 所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息;

⑸ 有k个孩子的非终端结点恰好包含有k-1个关键字。

在B-树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。

因为叶子结点不包含关键字,所以可以把叶子结点看成在树里实际上并不存在外部结点,指向这些外部结点的指针为空,叶子结点的数目正好等于树中所包含的关键字总个数加1。

B-树中的一个包含n个关键字,n+1个指针的结点的一般形式为:(n,P0,K1,P1,K2,P2,…,Kn,Pn)

其中,Ki为关键字,K1<K2<…<Kn, Pi 是指向包括Ki到Ki+1之间的关键字的子树的指针。

B-树的查找

在B树中查找给定关键字的方法是,首先把根结点取来,在根结点所包含的关键字K1,…,kj查找给定的关键字(可用顺序查找或二分查找法),若找到等于给定值的关键字,则查找成功;否则,一定可以确定要查的关键字在某个Ki或Ki+1之间,于是取Pi所指的结点继续查找,直到找到,或指针Pi为空时查找失败。

B-树的插入

B-树插入算法分析:

B-树的生成从空树开始,逐个插入关键字而得。关键字的个数必须至少为[m/2]-1,每次插入总在最底层某个终端结点添加一个关键字,如果该结点关键字个数小于m-1则直接插入,如果发现新插入关键字后,关键字总数超过m-1个则结点需要分裂,做法如下:

(a)假设结点p中已经含有m-1个关键字,再插入一个关键字之后(插入总要保持关键字数组的大小有序,从小到大排好序),可以将p分裂为p和p’,其中p含有的信息为[m/2]-1([m]表示大于m的最小整数),p’含有的信息为m-[m/2] ([m]表示大于m的最小整数)。然后将关键字K[m/2]和指向p’的指针则一起插入到p的双亲结点中去。

(b)检查双亲结点,如果双亲结点出现(a)的情况,则回到步骤a继续执行。直到插入满足条件为止,树的深度增加过程是随着插入而自下而上生长的过程。

B-树的删除:

B-树删除算法分析,分以下5种情况讨论:

(a)被删除关键字所在的结点为叶结点,关键字数目大于或等于[m/2],则只需要直接删去Ai和Ki即可;

(b)被删除关键字所在的结点为叶结点,关键字数目等于[m/2]-1,相邻的左右兄弟关键字数目至少有一方大于或者等于[m/2],此时,如果右兄弟关键字数目大于或者等于[m/2],则将右兄弟中最小的关键字上移到双亲结点中,然后将其中紧靠在上移关键字左边的一个关键字移动到被删除关键字所在的结点的最右边;否则,如果左兄弟的关键字数目大于或者等于[m/2],则左兄弟中最大的关键字上移到双亲结点中,将紧靠在该上移关键字右边的一个关键字移动到被删除关键字所在的结点的最左边。这些做法类似于减法的借位运算。

(c)被删除关键字所在的结点为叶结点,关键字数目等于[m/2]-1,相邻的左右兄弟关键字数目均等于[m/2]-1,则从双亲借关键字补充,然后算法进入非叶结点的删除判断;

(d)被删除关键字所在的结点为非叶结点,并且关键字数目大于或等于[m/2],则删去Ai和Ki后,原来关键字的左右孩子进行合并,若合并后的结点的关键字数目满足B-树性质,则结束,而对于关键字数目大于m-1,则进行一次分裂,将其中一个结点移到当前结点中。

(e)被删除关键字所在的结点为非叶结点,关键字数目等于[m/2]-1,相邻的左右兄弟关键字数目均等于[m/2]-1,则删除该关键字之后优先判断能否从被删除的关键字的左右孩子中寻找关键字补充,如果左右孩子的关键字数目均为[m/2]-1,如果此结点已经是树的根,则直接将被删除关键字的左右孩子结点合并即可,如果不是树的根,则从自己的双亲补充关键字,然后重复上述判断算法(d)或者(e)。

 

原创粉丝点击