B-TREE+(自平衡树)

B-TREE+ 是在B-TREE 的基础上建立起来的,所以,非常概念有必要先看看B-TREE!

B-TREE是为磁盘等辅助存取设备设计的一种平衡查找树,它实现了以 O(log n) 时间复杂度执行查找、顺序读取、插入和删除操作。由于 B 树和 B 树的变种在降低磁盘 I/O 操作次数方面表现优异,所以经常用于设计文件系统和数据库。

目录:

  • B 树内的节点关系
  • B 树的定义
  • B 树的操作
  • B 树的变种
  • B+ 树的优势

如图一颗键值为英语字母的B树,带浅色阴影的节点是查找R时候要检查的节点(可以理解成路径)

 

B 树内的节点关系

B 树中的节点分为内部节点(internal node) 和叶子节点(leaf node)

内部节点也可以称为非叶子节点。

B 树的内部节点可以包含 2 个以上的子节点,所以在设计时可以预先设定可包含子节点的数量范围,也就是上界(Upper Bound)下界

(Lower Bound)。当向节点插入或删除数据时,也就意味着子节点的数量发生变化。为了维持在预先设定的数量范围,内部节点可能会被合并(Join)拆分(Split)

因为子节点的数量有一定的范围,所以 B 树不需要频繁地变化以保持平衡。但同时,由于节点可能没有被完全填充,所以会浪费一些空间。 

B 树中每一个内部节点会包含一定数量的键值(Key)。这些键值同时也扮演着分割子节点的角色。例如,假设某内部节点包含 3 个子节点,则实际上必须有 2 个键值:a1 和 a2。其中,a1 的左子树上的所有的值都要小于 a1,在 a1 和 a2 之间的子树中的值都大于 a1 并小于 a2,a2 的右子树上的所有的值都大于 a2

通常,键值的数量被设定在 d 和 2d 之间,其中 d 是可包含键值的最小数量。可知,d + 1 是节点可拥有子节点的最小数量,也就是树的最小的度(Degree)。因数 2 将确保节点可以被合并或拆分。

如果一个内部节点有 2d 个键值,那么添加一个键值给该节点将会导致 2d + 1 的数量大于范围上界,则会拆分 2d + 1 数量的节点为 2 个 d 数量的节点,并有 1 个键值提升至父节点中。

类似地,如果一个内部节点和它的邻居节点(Neighbor)都包含 d 个键值,那么删除一个键值将导致此节点拥有 d – 1 个键值,小于范围下界,则会导致与邻居节点合并。合并后的节点包括 d – 1 的数量加上邻居的 d 的数量和两者的父节点中的 1 个键值,共为 d – 1 + d + 1 = 2d 数量的节点。

ps:上面这段有点绕口,你只需记住,为了维持事先设定好的值,存在拆分内部节点和合并内部节点的情况。

深度(Depth)描述树中层(Level)的数量。B 树通过要求所有叶节点保持在相同深度来保持树的平衡。深度通常会随着键值的不断添加而缓慢地增长。

 B+ 树的优势

 B+ 是B树的一个变种,在内部节点中存储的键值同样也会出现在叶子节点中,但内部节点中不会存储关联附属的数据和指针,在叶子节点中不仅存储键值,

还会存储关联附属数据或指针,这样,所有的附属数据都能保存在叶子节点中,只将键值和子女指针保存在内节点中,因此最大化了内节点的分之能力。此外,

叶节点还增加了一个指向下一个顺序关联的叶子节点的指针,以改进顺序读取的速度。

 常见的文件系统和数据库均使用 B+ 树实现,例如:

  • 文件系统:NTFS, ReiserFS, NSS, XFS, JFS, ReFS, BFS, Ext4;
  • 关系型数据库:DB2, Informix, SQL Server, Sybase ASE, SQLite,oracle;
  • nosql数据库:CouchDB, Tokyo Cabinet;

 TO BE CONTINUTED....

优势在于:

由于内部节点不存储键值关联的附属数据,所以内部节点的节省空间可以存储更多的键值,也就意味着从磁盘中

读取一页时可以获取更多的键值信息,

叶节点形成一个链状,所以随树的全扫描就对所有叶子节点的线性遍历。

你还得掌握一些概念和知识,这将有助于你对后面关于索引文章滴阅读

 对这一节知识的理解,将大大有助于我们对数据库中索引的使用

参考文献:

http://www.51itstudy.com/44497.html

原文地址:https://www.cnblogs.com/mc67/p/4812217.html