码迷,mamicode.com
首页 > 其他好文 > 详细

B树的生成

时间:2017-07-22 09:49:29      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:个数   art   preview   border   大于   节点   tle   i++   ade   

B树的生成
flyfish 2015-7-19
从空树開始构建一棵B树 逐个插入keyword

规则:

除根结点之外的全部非终端结点至少有?m/2?棵子树,所以keyword的个数必须 n为keyword个数
?m/2?-1?n。


依照A0,K1,A1。K2,A2,…,Kn,An
也就是指针个数比keyword个数多一个

由于树中每一个结点至多有m 棵子树。所以该结点的keyword个数不能超过m-1

也就是,keyword个数的阈值 ?m/2??1?n?m?1

每次插入一个keyword不是在树中加入一个叶子结点,由于这样不再是有效的B树而是首先在最低层的某个非终端结点中加入一个keyword,若该结点的keyword个数不超过m-1,则插入完毕,否则要产生结点的“分裂”

绿色:keyword个数
红色:指针
蓝色:keyword
构建Degree为3keyword从1到7的B树

技术分享

普通情况下,结点可例如以下实现分裂 引用自严蔚敏《数据结构》

如果*p结点中已有m-1个keyword。当插入一个keyword之后。结点中含有信息为:

(m。A0,(K1A1)。…。(KmAm)

且当中 Ki<Ki+1 , 1?i< m

此时可将*P节点分裂为*P和*P’两个结点,

*p结点中含有信息

?m/2?-1。A0,(K1A1),…,(K?m/2??1A?m/2??1)

*p’结点中含有信息

m-?m/2?A?m/2?。(K?m/2?+1A?m/2?+1 ),… ,(KmAm)

而keywordK?m/2?和指针*p’一起插入到*p的双亲结点中.

简化理解
m为B树的阶,n为节点的个数

若在一个包括n<m?1个keyword的结点中插入一个新的keyword,则把新的keyword直接插入该结点就可以。

但若把一个新的keyword插入到包括m-1个keyword的结点中,则将引起结点的分裂。

生成一新结点,把原结点上的keywordK按升序排序,也就是 Ki<Ki+1
满足:左边的小于中间的keyword;右边的大于中间的keyword,从中间位置把keyword(不包括中间位置的keyword)分成两部分。

左部分所含keyword放在旧结点中。右部分所含keyword放在新结点中,中间位置的keyword连同新结点的存储位置(指向新节点的指针)插入到双亲结点中。

如果双亲结点的keyword个数也超过m-1,则要再分裂,再往上插入,此时B树可能朝着根的方向生长。

B树的生成

标签:个数   art   preview   border   大于   节点   tle   i++   ade   

原文地址:http://www.cnblogs.com/jhcelue/p/7220272.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!