十三、数据结构---B+树

来源:互联网 发布:淘宝美工的电脑配置 编辑:程序博客网 时间:2024/05/24 23:12
十四、数据结构---B+树
一、B-树
 1、什么是B-树
    具体讲解之前,有一点,再次强调下:B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-tree,其实,这是个非常不好的直译,很容易让人产生误解。如人们很可能会以为B-树是一种树而B树又是另一种树。而事实上是,B-tree就是指的B树。
  我们知道,B树是为了磁盘或其他存储设备而设计的一种多叉(下面你会看到,相对于二叉,B树每个内结点有多个分支,即多叉)平衡查找树。与红黑树很相似,但在降低磁盘I/O操作方面要更好一些。许多数据库系统都一般使用B树或者B树的各种变形结构,如下文即将要介绍的B+树存储信息。
 2、B-树概念(用阶定义B树)
    是一种多路搜索树(并不是二叉的),又叫平衡多路查找树。一棵m阶的B树的特性如下:
    a、定义任意非叶子结点最多只有M个儿子;且M>=2;
    b、根节点的儿子数为[2,M](此时的根结点不是叶子结点);
    c、除根结点以外的非叶子结点的儿子数为[M/2,M];
    d、有j个孩子的非叶结点恰好有j-1个关键字,关键字按递增顺序排列。
    e、非叶子结点的关键字个数n必须满足: [ceil(M / 2)-1]<= n <= M-1;(其中ceil(x)是一个取上限的函数)
    f、非叶子结点的关键字:K[1],K[2],...,K[M-1];且K[i] < K[i+1];
    g、非叶子结点的指针:P[1],P[2],...,P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1],K[i])的子树;
    h、所有的叶子结点位于同一层,叶子结点不包含任何关键字信息


    一棵含有N个总关键字数的m阶的B树的最大高度是多少?
    答:若B树包含N个关键字,则次非叶子结点包含有N-1个孩子结点,而所有的叶子结点都在第i层,我们可以得出:
     1、因为根至少有两个孩子,因此第2层至少两个结点
     2、除根和叶子外,其他结点至少┌m/2┐个孩子
     3、因此在第3层至少有2*┌m/2┐个结点
     4、在第4层至少有2*(┌m/2┐^2)个结点
     5、在第i层至少有2*(┌m/2┐^(i-2))个结点,
     于是有: N+1 ≥ 2*(┌m/2┐^(i-2))
     考虑第i层的结点个数为N+1,那么2*(┌m/2┐^(i-2)) ≤ N+1,也就是i层的最少结点数刚好达到N+1个,
     即: i ≤ log┌m/2┐((N+1)/2)+2;


     所以,当B树包含N个关键字时,B树的最大高度为i-1(因为计算B树高度时,叶结点所在层不计算在内),
     即: i-1 ≤ log┌m/2┐((N+1)/2)+1;(log_ceil(m/2)(N+1)/2+1)
     ceil:返回不小于(m/2)的下一个整数。
 3、插入操作
    插入一个元素时,首先在B树中是否存在,如果不存在,即在叶子结点处结束,然后在叶子结点中插入该新的元素,注意:如果叶子结点空间足够,这里需要向右移动叶子结点中大于新插入关键字的元素,如果空间满了以致没有足够的空间去添加新的元素,则将该结点进行"分裂",将一半数量的元素分裂到新的其相邻右节点中,中间关键字元素上移到父结点中(当然,如果父结点空间满了,也同样需要"分裂"操作),而且当结点中关键元素向右移动了,相关的指针也需要向右移。如果在根结点插入新元素,空间满了,则进行分裂操作,这样原来的根结点中的关键字元素向上移动到新的根结点中,因此导致树的高度增加一层。


    B-树的特性:
     1、关键字集合分布在整颗树中;
     2、任何一个关键字出现且只出现在一个结点中;
     3、搜索有可能在非叶子结点结束;
     4、其搜索性能等价于在关键字全集内做一次二分查找;
     5、自动层次控制;
 二、B+树
    B+树是B-树的变体,也是一种多路搜索树:
     a、任意非叶子节点最多有M个子节点;且M>2;
     b、除根结点以外的非叶子结点至少有M/2个子节点;
     c、根结点至少有两个子节点;
     d、除根结点外每个结点存放至少M/2和至多M个关键字;(至少2个关键字)
     e、非叶子结点的子树指针与关键字个数相同;
     f、所有结点的关键字:K[1],K[2],...K[M];且K[i] < K[i+1];
     g、非叶子结点的子树指针P[i],指向关键字值属于[K[i],K[i+1])的子树;
     h、所有叶子结点位于同一层;
     i、为所有叶子结点增加一个链指针;
     j、所有关键字都在叶子结点出现;


    B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
     B+的特性:
      1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
      2.不可能在非叶子结点命中;
      3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
      4.更适合文件索引系统;
 三、B+树的查找
    对B+树可以进行两种查找运算:
    1.从最小关键字起顺序查找;
    2.从根节点开始,进行随机查找。
    在查找时,若非终端结点上的关键值等于给定值,并不终止,而是继续向下直到叶子结点。因此,在B+树中,不管查找成功与否,每次查找都是走了一条从根到叶子结点的路径。
 四、总结
    B树:有序数组+平衡多叉树;
    B+树:有序数组链表+平衡多叉树;