资源描述
.,B-树,前面讨论的查找算法都是在内存中进行的,它们适用于较小的文件,而对较大的、存放在外存储器上的文件就不合适了。 1972年R.Bayer和E.M.McCreight提出了一种称为B-树的多路平衡查找树,它适合在磁盘等直接存取设备上组织动态的查找表。,一. B-树的定义,B-树是一种平衡的多路查找树,在文件系统中,成为索引文件的一种有效结构,得到广泛应用。,.,一棵m阶(m3)B-树,或为空树,或为满足下列特性的m叉树:(1)树中每个结点至多有m棵子树;(2)若根结点不是叶子结点,至少有两棵子树;(3)所有的非终端结点中包含下列信息 (n,p0,k1,p1,k2,p2,kn,pn)其中:ki(1in)为关键字,且kiki+1(1in); pj(0jn)为指向子树根结点的指针,且pj(0jn)所指子树中所有结点的关键字均小于kj+1,pn所指子树中所有结点的关键字均大于kn,n(m/2-1nm-1)为关键字的个数(n+1为子树个数)。,B-树,.,(4)除根结点之外所有非终端结点至少有m/2棵子树,也即每个非根结点至少应有m/2-1个关键字;(5)所有的叶子结点都出现在同一层上,并且不带信息(可看作外部结点或查找失败的结点,这些结点不存在,指向这些结点的指针为空)。,B-树,.,2 50 80,root,2 20 40,2 55 70,例一棵3阶的B-树,B-树,.,B-树的基本操作,B-树的查找运算,2 50 80,root,2 20 40,2 55 70,.,B-树的插入运算,在B-树中插入关键字k的方法:首先在树中查找k,找到,直接返回(假设不处理相同关键字的插入);否则查找操作必失败于某个叶子结点上,可以确定关键字k的插入位置,将k插入到所指叶结点位置上。若该叶结点原来非满(结点中原有关键字总数小于m-1),则插入k并不会破坏B-树的性质,故插入操作完成,例如,在下图所示5阶B-树的某结点(假设为p结点)中插入新的关键字150时的结果。,B-树的基本操作,.,2 100 190,3 100 150 190,在关键字个数不满的结点中插入关键字,若p所指示的叶结点原为满,则插入后破坏了B-树的性质(1),须调整使其维持B-树的性质不变。,B-树的基本操作,.,调整方法:将违反性质(1)的结点以中间位置的关键字keym/2为划分点,将该结点(即p)(m,p0,k1,p1,km,pm)分裂为两个结点左边:(m/2-1,p0,k1,km/2-1,pm/2-1)右边:(m-m/2,pm/2,km/2+1,km,pm)同时把中间关键字km/2插入到双亲结点中。于是双亲结点中指向被插入结点的指针pre改成pre、km/2、pre三部分。指针pre指向分裂后的左边结点,指针pre指向分裂后的右边结点。由于将km/2插入双亲时,双亲结点亦可能原本为满,若如此,则需对双亲做分裂操作。分裂过程的例子如图所示。,B-树的基本操作,.,2 80 220,4 90 120 140 160,p,3 80 120 220 ,2 90 100,2 140 160,pre,pre,pre,km/2,插入100以前,插入100以后,B-树的基本操作,.,例如初始时B-树为空树,通过逐个向B-树中插入新结点,可生成一棵B-树。下图说明了一棵5阶B-树的生长过程。,6 8 15 16,6 8,15,16 22,6 8 10,15,16 18 22 32,(a)插入6、8、15、16 (b)插入22 (c)插入10、18、32,6 8 10,15 20,16 18,22 32,6 8 10 12,15 20,16 18 19,22 32 40 50,6 8 10 12,15 20 40,16 18 19,22 32,50 56,(d)插入20 (e)插入12、19、40、50 (f)插入56,B-树的基本操作,.,6 8,9 15 20 40,16 18 19,22 26 32 36,50 52 55 56,10 12,6 8,9 15,16 18 19,22 26,50 52 55 56,10 12,36 38,20,32 40,(g)插入9、26、36、52、55 (h)插入38,.,B-树的基本操作,B-树的删除运算,在B-树上删除一个关键字,首先找到该关键字所在结点及其在结点中的位置。可分为两种情况:(1)被删除结点ki在最下层的非终端结点(即叶子结点的上一层),则删除ki及它右边的指针pi。 删除后若结点中关键字数目不少于m/2-1,删除完成,否则进行“合并”结点的操作。(2)若删结点ki是最下层的非终端结点以上某层的结点,根据B-树的特性可知,可以用ki右边指针pi所指子树中最小关键字y代替ki,然后在相应的结点中删除y,或用ki左边指针pi-1所指子树中最大关键字x代替ki,然后在相应的结点中删除x。,.,例 :删除图所示3阶B-树中的关键字50,可以用它右边指针所指子树中最小关键字60代替50,尔后转化为删除叶子上面一层的结点中的60,删除后得到的B-树如图所示。,.,90 115,8,40,28,150 200,85 120,50,60 80,90 115,8,40,28,150 200,85 120,60,80,3阶B-树中删除50以60代替50,.,删除B-树叶子上面一层结点中的关键字的方法,分三种情形:,1)被删关键字所在叶子上面一层结点中的关键字数目不小于m/2,则只需要从该结点中删去关键字ki和相应的指针pi,树的其它部分不变。,例:,删除60与115,.,2)被删关键字所在叶子上面一层结点中的关键字数目等于m/2-1,而与该结点相邻的右兄弟结点(或左兄弟结点)中的关键字数目大于m/2-1,则需要将其右兄弟的最小关键字(或其左兄弟的最大关键字)移至双亲结点中,而将双亲结点中小于(或大于)该上移关键字的关键字下移至被删关键字所在的结点中。例如从图中删除关键字90,结果如图所示。,.,3)被删关键字所在叶子上面一层结点中的关键字数和其相邻的兄弟结点中的关键字数目均等于m/2-1,则第(2)种情况中采用的移动方法将不奏效,此时须将被删关键字所有结点与其左或右兄弟合并。不妨设该结点有右兄弟,但其右兄弟地址由双亲结点指针pi所指,则在删除关键字之后,它所在结点中剩余的关键字和指针加上双亲结点中的关键字ki一起合并到pi所指兄弟结点中(若没有右兄弟,则合并至左兄弟结点中)。,.,例删去关键字120,则应删去120所在结点,并将双亲结点中的150与200合并成一个结点,删除后的树如图所示。如这一操作使双亲结点中的关键字数目小于m/2-1,则依同样方法进行调整,最坏的情况下,合并操作会向上传播至根,当根中只有一个关键字时,合并操作将会使根结点及其两个孩子合并成一个新的根,从而使整棵树的高度减少一层。,.,例删除关键字8关键字所在结点无左兄弟,只检查其右兄弟,然而右兄弟关键字数目等于m/2-1,此时应检查其双亲结点关键字数目是否大于等于m/2-1,但此处其双亲结点的关键字数目等于m/2-1,从而进一步检查双亲结点兄弟结点关键字数目是否均等于m/2-1,这里关键字28所在的结点的右兄弟结点关键字数目正好等于m/2-1,因此将28和40结合成一个结点,50和85结合成一个结点,使得树变矮,删除结点8后的结果如图所示。,
展开阅读全文