408-数据结构-B树&B+树

B树

B树,多路平衡查找树。也就是二叉排序树升级为m叉树。

一个结点组成为m个子树与m-1个关键字,关键字左右两边带两个子树,关键字大于相邻左子树,小于相邻右子树。
如果树中一个结点最多含有m个子树称为m阶B树。

正常B树需要满足条件:

  1. 一个结点最多含有m个子树,m-1个关键字
  2. 如果根结点不是终端结点,那么至少有两颗子树
  3. 一个结点至少包含m/2向上取整个子树(除了根结点),至少包含m/2向上取整-1个关键字。根结点最小子树个树可以是2.
  4. 满足排序条件
  5. 每一个结点平衡因子必须为0,也就是每一个结点的任何子树高度都必须相同。所有叶子结点都在同一高度,且不带任何信息。

B树也就是多叉排序树所以他必须满足:第一颗子树所有关键字<第一个关键字<第二颗子树所有关键字…

具有n个关键字的m阶B树的高度取值范围为
l o g m ( n + 1 ) < = h < = l o g m / 2 向 上 取 整 n + 1 2 + 1 log_m(n+1) <= h<=log_{m/2向上取整}{\frac{n+1}{2}}+1 logm(n+1)<=h<=logm/22n+1+1

n个关键字如果要让高度最小,每个结点要尽可能多装子树,所以关键字最多有(m-1)*(1+m+m2+…+mh-1)=mh-1.可以解得左边不等式。
如果要让高度最高,每一个结点尽可能少装子树,但必须符合B树定义,所以第一层1个结点,第二层2个结点,第三层2(m/2向上取整)1个结点,那么到了第h层也就是有2(m/2)h-2个结点。那么h+1也就是叶子结点有2(m/2)h-1个结点。N个关键字的B树必有N+1个叶子结点。因为有N个关键字可以获得N+1个区间,一个叶子结点对应了一个区间。所以N+1>=2(m/2)h-1可得第二个不等式。

B树进行查询操作也与二叉排序树类似,遍历结点,如果发现关键字,直接返回,如果发现第一个大于查找值,则去他相邻左子树继续查找,如果是最后一个,就去他的右子树。如果找到了叶子结点,说明查找失败。
显而易见,B树查找效率也与高度息息相关,所以才有了每一个结点最少要有m/2向上取整个子树。与平衡与否也相关所以定死每一个结点平衡因子为0.

B树插入操作:
B树插入点也必须是终端结点。因为新插入一个关键字也就意味着新增加了一个不可能区间,而规定这个不含有任何信息的空链域必须在叶子结点,索引只能插入到终端结点。
但思想与二叉排序树相同,也是先查找,然后引起查找失败返回点,返回点的父结点就是插入点。
插入点进行插入操作,可能会导致结点索引个数超过m-1.如果超过,将中间位置也就是m/2这个索引点放到父结点,然后左边右边新开一个子树。如果父结点依旧超过m-1递归循环。此外放到父结点也必须要满足增序,也就是放到指向子树这个位置。

B树删除操作:
终端结点直接删除。
非终端结点与二叉排序树相同,可以找直接前驱也可以是直接后继,找到将其替换,然后删除直接前驱或者直接后继。直接前驱与直接后继也与二叉排序树相同。
直接前驱:找索引点左子树最右元素
直接后继:找索引点右子树最左元素

删除操作同样可能引起不满足B树定义,主要是子树个树不满足。主要解决方式:

  1. 找兄弟结点借,如果兄弟结点个树足够借的话,将兄弟结点放到父结点,将父结点一个下放到删除结点。
  2. 如果兄弟不够借,将父结点夹在二者中间的关键字下放,然后两个子树合并。

B+树

可以认为是参考了索引查找的B树。
每一个结点有m个索引,每一个索引对应一个指向子树根结点指针,而这个索引就是子树索引的最大值。

m阶B+树满足下列条件:

  1. 分支结点最多m个子树
  2. 非叶根结点最少两个子树,其他每个分支结点最少m/2向上取整个子树
  3. 关键字个树与子树个树相同
  4. 叶子结点包含索引以及指向真实数据的指针,叶子结点都是按照索引值从小到大排序,且叶结点按照类似链表存在指针将每一个叶子链接起来,所以B+树支持顺序查找。
  5. 所有分支结点包含各个子结点关键字最大值与其指针

B树与B+树区别:

  1. B树关键字与子树个树差1,但是B+树相同
  2. B+树叶子结点包含所有关键字,B树关键字不重复
  3. B+树查找一定要找到叶子结点,而B树可能找到某一层就找到了
  4. B+树每一个结点都只是提供索引信息,并不包含真实数据,只有在叶子结点才存在指向真实数据的指针

正常来说B+树索引速度比B树快,主要是因为操作系统的原因。存储信息通常存储在操作系统文件系统。文件系统将物理空间逻辑划分为一个个大小相同的逻辑块。一个逻辑块也就对应树中一个结点。如果一个结点只包含索引,那么一个结点就能够存储更多的索引,使得树更矮,减少操作系统对文件块的访问,从而使得速度提升。

你可能感兴趣的:(408-数据结构,数据结构,算法)