b树分析

  维基百科对B树的定义为:在计算机科学中,B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉查找树(binary search tree),可以拥有多于2个子节点。与自平衡二叉查找树不同,B树为系统大块数据的读写操作做了优化。B树减少定位记录时所经历的中间过程,从而加快存取速度。B树这种数据结构可以用来描述外部存储。这种数据结构常被应用在数据库和文件系统的实作上。

  B树的特点有:

  1.B树总是高度平衡的,其所有叶子节点在同一高度上。

  2.更新和查找操作仅仅影响到很少的磁盘块。(影响越少的磁盘块,需要越少的磁盘I/O)

  3.B-tree在相同的磁盘块上保持相关(即具有相似键值的记录),这有助于最大限度地减少由于参考位置引起的搜索磁盘I/O。

  4.B树保证树中的每个节点中值的数量至少满足一定的最小百分比。这样可以提高空间效率,同时减少在搜索或更新操作过程中所需的典型磁盘数量。

  每个结点的属性:
     (1)x.n: 每个结点包含的关键字个数;
     (2)x.key1, x.key2, x.key3…..x.keyn, 以非降序排列。
     (3)x.leaf, 表示x结点是否是叶子结点。
     (4)x.ci: 每个结点还包含x.n+1个孩子指针x.c1, x.c2, x.c3……x.cn+1

  一个m阶B树的外形特征为:

  根节点要么是叶子节点,要么有至少两个子节点。

  每个内部节点,除了根节点,有┌m/2┐ 到m个子节点。即每个节点有┌m/2┐ – 1到m-1个键值。

  内部结点的关键字key:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
  内容结点的指针next:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子 树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;

      PS:有些版本是非根的内部节点必须有t到2t个子节点。

一个B树实例:

《b树分析》

              B树 (Bayer & McCreight 1972) (order为5) (Knuth 1998).

对B树的基本操作:

1.搜索:搜索B树与搜索二叉树很相似,只是在每个结点所做的不是二叉或者“两路”分支决定,而是根据该结点的子女数所做的多路分支决定。更准确的说,在每个内结点x处,要做n[x]+1路的分支决定。

2.插入:向B树中插入关键字,同二叉查找树中插入一个关键字类似,要查找插入新关键字的叶子结点位置。因为不能把关键字插入到一个已满的叶子结点中,故需要将一个已满的结点按其中间关键字分裂成两个结点,中间关键字被提升到该结点的父结点中。但是这种满结点的分裂动作会沿着树向上传播。为了解决这个问题,可以采取这样一种策略:当沿着树根往下查找新关键字所属位置时,就沿途分裂遇到的每个满结点。因此,每当要分裂一个满结点时,就能确保它的父结点不是满的。

 

3.删除:转载自http://blog.163.com/zhoumhan_0351/blog/static/39954227200910231032917/

在B-树上删除关键字k的过程分两步完成:

   (1)利用前述的B-树的查找算法找出该关键字所在的结点。然后根据 k所在结点是否为叶子结点有不同的处理方法。

   (2)若该结点为非叶结点,且被删关键字为该结点中第i个关键字key[i],则可从指针son[i]所指的子树中找出最小关键字Y,代替key[i]的位置,然后在叶结点中删去Y。

因此,把在非叶结点删除关键字k的问题就变成了删除叶子结点中的关键字的问题了。

在B-树叶结点上删除一个关键字的方法是:
  首先将要删除的关键字 k直接从该叶子结点中删除。然后根据不同情况分别作相应的处理,共有三种可能情况:
(1)如果被删关键字所在结点的原关键字个数n>=ceil(m/2),说明删去该关键字后该结点仍满足B-树的定义。这种情况最为简单,只需从该结点中直接删去关键字即可。
(2)如果被删关键字所在结点的关键字个数n等于ceil(m/2)-1,说明删去该关键字后该结点将不满足B-树的定义,需要调整。
  调整过程为:如果其左右兄弟结点中有“多余”的关键字,即与该结点相邻的右(左)兄弟结点中的关键字数目大于ceil(m/2)-1。则可将右(左)兄弟结点中最小(大)关键字上移至双亲结点。而将双亲结点中小(大)于该上移关键字的关键字下移至被删关键字所在结点中。
(3)如果左右兄弟结点中没有“多余”的关键字,即与该结点相邻的右(左)兄弟结点中的关键字数目均等于ceil(m/2)-1。这种情况比较复杂。需把要删除关键字的结点与其左(或右)兄弟结点以及双亲结点中分割二者的关键字合并成一个结点,即在删除关键字后,该结点中剩余的关键字加指针,加上双亲结点中的关键字Ki一起,合并到Ai(是双亲结点指向该删除关键字结点的左(右)兄弟结点的指针)所指的兄弟结点中去。如果因此使双亲结点中关键字个数小于ceil(m/2)-1,则对此双亲结点做同样处理。以致于可能直到对根结点做这样的处理而使整个树减少一层。

  总之,设所删关键字为非终端结点中的Ki,则可以指针Ai所指子树中的最小关键字Y代替Ki,然后在相应结点中删除Y。对任意关键字的删除都可以转化为对最下层关键字的删除。


《b树分析》


如图示:

a、被删关键字Ki所在结点的关键字数目不小于ceil(m/2),则只需从结点中删除Ki和相应指针Ai,树的其它部分不变。
《b树分析》

b、被删关键字Ki所在结点的关键字数目等于ceil(m/2)-1,则需调整。调整过程如上面所述。


《b树分析》



c、被删关键字Ki所在结点和其相邻兄弟结点中的的关键字数目均等于ceil(m/2)-1,假设该结点有右兄弟,且其右兄弟结点地址由其双亲结点指针Ai所指。则在删除关键字之后,它所在结点的剩余关键字和指针,加上双亲结点中的关键字Ki一起,合并到Ai所指兄弟结点中(若无右兄弟,则合并到左兄弟结点中)。如果因此使双亲结点中的关键字数目少于ceil(m/2)-1,则依次类推。


《b树分析》
《b树分析》




希望本文能对您了解B树有所帮助。

算法

    原文作者:B树
    原文地址: https://blog.csdn.net/sq__D_zhang/article/details/68955188
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注