实现B-树的相关运算算法

B-tree即B树,B即Balance,平衡的意思。B-树是一种多路搜索树(并不一定是二叉的)。

当查找的文件较大,且存放在磁盘等直接存取设备中时,为了减少查找过程中对磁盘的读写次数,提高查找效率,基于直接存取设备的读写操作以"页"为单位的特征。

1970年,R.Bayer和E.M.McCreight提出了一种称之为B-树的多路平衡查找树,在文件系统中有所应用,主要用作文件的索引。它是一种平衡的多叉树,称为B树(或B-树、B_树),适合在磁盘等直接存取设备上组织动态的查找表。

1、B-树(B树)的基本概念

B-树中所有结点中孩子结点个数的最大值称为B-树的阶,通常用m表示,从查找效率考虑,一般要求m>=3。

B-树(B树)结构特性

一棵m阶B-树或者是一棵空树,或者是满足以下条件的m(m>=3)叉树:

(1)根结点只有1个,关键字字数的范围[1,m-1],分支个数取值范围[2,m]

(2)每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

(3)每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m,即每一个叶子结点最多包含m-1个关键字

(4)所有的叶子结点都位于同一层,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。即所有叶子节点具有相同的深度,等于树高度。如一棵四阶B-树,其深度为4

(5)每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划

这棵三阶B-树符合上述所列的特征。

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

⑵若根结点不是叶子结点,则至少有两棵子树

⑶除根结点之外的所有非叶子结点至少有[m/2] 棵子树

⑷所有的非叶子结点中包含以下信息数据:

(n,A0,K1,A1,K2,A2,…,Kn,An

其中:Ki(i=1,2,…,n)为关键码,且k1<k2<k3...<kn,Ai 为指向子树根结点的指针(i=0,1,…,n),且指针A(i-1)所指子树中所有结点的关键码均小于Ki (i=1,2,…,n),An 所指子树中所有结点的关键码均大于Kn。

               n为关键码的个数。

2、B-树的基本操作-查找介绍

B-树的查找类似二叉排序树的查找,所不同的是B-树每个结点上是多关键码的有序表,在到达某个结点时,先在有序表中查找,若找到,则查找成功;否则,到按照对应的指针信息指向的子树中去查找,当到达叶子结点时,则说明树中没有对应的关键码。

给出如下的一棵4阶(B-树中所有结点中孩子结点个数的最大值)的B-树结构:

 

这是一个4阶的B-树,假设需要查找45这个数是否在B-树中。

1)从根结点出发,发现根结点a有1个关键字为35,其中45>35,往右子树走,进入结点c

2)发现结点c有2个关键字,其中43<45<78,所以进入结点g

3)发现结点g有3个关键字,其中3<45<47,所以继续往下走,发现进入了结束符结点:F,所以45不在B-树中

从上述的查找的过程可以得出,在B-树的查找过程为:

1)B-树中查找结点

2)在结点中查找关键字

由于B- 树通常存储在磁盘上, 则前一查找操作是在磁盘上进行的, 而后一查找操作是在内存中进行的,即 在磁盘上找到指针p 所指结点后, 先将结点中的信息读入内存, 然后再利用顺序查找或折半查找查询等于K 的关键字。显然, 在磁盘上进行一次查找比在内存中进行一次查找的时间消耗多得多。

因此, 在磁盘上进行查找的次数、即待查找关键字所在结点在B-树上的层次数, 是决定B树查找效率的首要 因素,对于有n个关键字的m阶B-树,从根结点到关键字所在结点的路径上路过的结点数不超过:

3、B-树的插入

B-树的插入,主要分为如下两个步骤:

1)使用查找算法查找出关键字的插入位置,如果在B-树中查找到了关键字,则直接返回。否则,它一定会失败在某个最底层的终端结点上。

2)然后,判断那个终端结点上的关键字数量是否满足:n<=m-1,如果满足的话,直接在该终端结点上添加一个关键字,否则,需要产生结点的“分裂”。

分裂的方法是:生成一新结点。把原结点上的关键字和需要插入的值key按升序排序后,从中间位置把关键字(不包括中间位置的关键字)分成两部分。左部分所含关键字放在旧结点中,右部分所含关键字放在新结点中,中间位置的关键字连同新结点的存储位置插入到父结点中。如果父结点的关键字个数也超过(m-1),则要再分裂,再往上插。直至这个过程传到根结点为止。

举例说明,假设这个B-树的阶为:3。树的初始化时如下:

首先,插入一个关键字:30,得到如下结果:

再插入26,得到如下结果:

此时如图所示,在插入的终端结点中,它的关键字数已经超过了m-1=2,需要对结点进分裂,先对关键字排序,得到:26 30 37 ,所以左部分为(不包括中间值&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值