由树到数据库索引 (2)

       B树:首先要明白B树要处理什么问题,我们上面提到过的AVL树、二叉排序树以及我们没有提到过的红黑树,这些都是在内存中内部查找树,而B树是前面平衡树算法的扩展,它支持保存在磁盘或者网络上的符号表进行外部查找,这些文件可能比我们以前考虑的输入要大的多(难以存入内存)。既然内容保存在磁盘中,那么自然会因为树的深度过大而造成磁盘I/O读写过于频繁(磁盘读写速率是有限制的),进而导致查询效率低下。那么降低树的深度自然很重要了。因此,我们引入了B树,多路查找树。

       明白了B树是干什么用的,我们来个他下个定义,B树是一种平衡的多路查找树,结点最大的孩子数目为B树的阶,一个m阶的B树特征如下:

       1.每个根节点至少有2个孩子节点;

       2.每个非根的分支节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m;

       3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m;

       4.所有的叶子节点都位于同一层次;

       5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划(这个在下面解释下);

       接下来我们以3阶树为例子来说说上面这些特征是如何体现的,然后在讨论下B树的增加和删除节点情况,

       

由树到数据库索引

       上图是一颗3阶树,首先最大的孩子数目为3,所以是3阶树,我们来看下12,这是2结点,包含1个根节点和2个孩子结点,满足第2,3条,左子树11小于12,右子树13、15大于12,接下来我们看2,6结点,3结点包含2、6两个元素,和3个孩子结点,左子树1小于2、6,右子树8大于2、6,3、5位于左、右子树中间,满足以上条件;

       增加操作有3种情况:

       1.对于空树,插入一个2结点即可;

       2.插入到一个2结点的叶子上。这种情况考虑将其升级为3结点即可,这里进行解释一下,当插入3的时候,通过遍历会发现3比4小,只能插入到4的左子树,4有个子结点,这个时候只能将其升级为3结点,3比1大,插入到1的后继,这个时候形成右图样子。

      

由树到数据库索引

      3.插入3结点的情况相对比较麻烦,3结点是3阶树最大的容量,当向3结点插入的时候就要考虑拆分的情况,我们来看一下这几种情况。

      第一种情况:向2结点满元素的子节点插入时候,左图满足这种情况,当向4的右孩子结点6,7插入5的时候,6、7已经是3结点的,不能在增加,这个时候发现4结点是2结点,就需要将其升级为3结点,于是讲6、7拆分,6与4组成3结点,5成为中间孩子,7成为右孩子,如右图。

      

由树到数据库索引

      第二种情况:当向3结点的满元素的子节点插入时候,左图满足这种情况,当向12、14的左孩子9、10插入11的时候,发现9、10已经满足3结点,不能在增加,但是父亲节点也是3结点,这个时候在向上查找,发现12、14的父亲结点8,还可以进行插入,这个时候讲8升级为3结点,将8与12合并,最终生成右图样子。

      

由树到数据库索引

     再来看一种比较特殊的情况:当向4、6左孩子结点1、3插入元素的时候,发现都是3结点无法在进行拆分,这个是将1、3结点、4、6结点、8、12结点都进行拆分,形成右图样子;

     

由树到数据库索引

      删除操作:

      1.删除位于3结点的叶子结点,删除改元素即可,不会影响到别的结构,如下图:

     

由树到数据库索引

     2.删除元素位于一个2结点上,这里的情况比较复杂,我们分情况介绍:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpggxs.html