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,(K1。A1)。…。(Km,Am)
且当中 Ki<Ki+1 , 1⩽i< m
此时可将*P节点分裂为*P和*P’两个结点,
*p结点中含有信息
⌈m/2⌉-1。A0,(K1,A1),…,(K⌈m/2⌉−1。A⌈m/2⌉−1)
*p’结点中含有信息
m-⌈m/2⌉,A⌈m/2⌉。(K⌈m/2⌉+1,A⌈m/2⌉+1 ),… ,(Km。Am)
而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树可能朝着根的方向生长。