思路话语

。Arlen:思想有多远你就能走多远...

B减树与B加树 B-tree B+tree

B-tree就是B减树(因为存在一个B+树所以会导致这样的误解,实际上并没有B减树这个概念存在,-号只是一个连字符而已也可写成B_),也不要跟二叉树binary tree混淆了。

那么什么是B减树呢,一般说它是Bayer’s tree的缩写(bayer是这种树的创建者之一的名字,另外一种最常见的命名方法是
b=broad,bushy,因为这种树所有“外部叶节点”在同一level上聚集)。它适用于树的内部节点被频繁访问,但又一般不常访问这些节点以下
节点的情况,比如计算机的二级存储器硬盘等设备,常以结点为目录,叶节点为文件,,一般我们频繁访问目录但又不常深入最终每个文件。

实际上b减树也是要求一定的balance的(有人也说B减树的B代表balance,不过这样的话就与普通的平衡树相重意义了所以并不常采用这
种),,它是一种动态查找树,因为需要在每次update后都动态调整它的节点情况。只不过它并不需要作特别频繁的rebalancing动作,因为B
减树将外部节点维护在同一层次上这个特点使它只需要只很少的调整便可保持balanced。

那么B减树到底具体是如何一种数据逻辑呢?它到底如何使保持平衡只需很少的调整呢?更重要的是,B减树到底有什么用呢?

首先,这种树的某个(或每个)“内部非叶节点”的下层子节点(直接子树)是数量可变的,而且在一个区间里变动(我们呆会再来讨论这个所谓的区间),这个非叶节点维护
一堆elements和pointer,其中elments用来区别各个子树的取值范围,比如这个非叶节点有3个子节点为根的子树,那么它需要维护2个
(子节点数-1个)elments,假设为key1,key2,那么第一个子树的所有值都小于key1,中间子树的所有值都在key1和key2之间,
最右边子树的所有值都小于key2(当然,这是N叉树,3叉树,这里不是说二叉树的左右),很显然地,key1,key2这些elments是
sorted有序线性表,那么points部分呢,它指向每个子树..有几个子树(子节点)就有几个pointer.

所以,每个内部节点维护(该节点所拥有子树数-1)个的elements和(子树数)个的pointer.
叶节点在同一层上,没有element也没有pointer.,不带任何信息。

现在来讨论那个所谓的区间,以m为order的B减树(称为B-tree of order m),再设n是一个内部节点允许的最少节点数,那么那么区
间就是[n上界,m下界],以这种区间为表征的B减树一般呈现出以下特性
(1) 每个内部子节点(只要不是作为该子树的根或叶子)都至少有m/2个子节点;
注意,最多m,最少m/2;此时n相当于m/2
(2) 每个内部子节点(如果它就是作为子树的根并且不是叶子)那么最少可以有2个子节点;
这说明,该内部节点最大子elments数可以为m或m-1,最少elements数可以为m/2或m/2-1(n=m/2或n=m/2-1);
(3)每个内部子节点(如果它是叶子),,,那么不带任何elemnets或pointers

所以,“子树数-1个elements”,“子树数个pointer”,“叶节点不带任何信息”,“n-m的区间所体现的上面三点”,,这些都说明了什
么呢,这些特征都赋于了这种树什么样的特性和能力呢?

我们可以看到,如果内部节点不是作为最终叶节点,那么它(要讨论的这个内部节点)的子节点(它的下一级子节点)个数至少是半满half full的,这
意味着,在[m,n]区间内(或称[m/2,m])二个半满的内部节点可以进行合并形成一个合法的新内部节点。一个全满的内部节点可以分离成二个合法的
新内部节点(只要父节点中可以容纳这些新子节点就可以),从这层意义上,的确不需要太多的高度上的平衡。

更多的关于这种树的删除,插入算法可以从这层意义上引申而来

posted on 2010-06-02 15:08  Arlen  阅读(2940)  评论(0编辑  收藏  举报

导航