天天看点

查找算法 | B+树详细分析

在阅读本篇博客前请先阅读《数据结构和算法 | B-树详细分析》

B+树是由B树变来的,B+树和B树有这样的区别:

  1. B+树的非叶子节点不记录数据本身,只记录引用的连接,并且结点中仅含有其子树中的最大(或最小)关键字。基于此特点,B+树在非叶子节点的文件会非常小;
  2. B+树的所有的叶子结点中包含了全部关键字的信息;
  3. B+树的每个叶子节点都有指向相邻的下一个兄弟叶子节点的指针且叶子结点本身依关键字的大小自小而大顺序链接。基于此特点,B+树在范围查询上的效率比B树高了很多;
  4. 这条区别是有争议的,有人说B+树的节点中关键字和子节点个数相同,也有人说B+树和B树一样关键字比子节点少一个。

如果我们认为上述第三条中关键字和子节点个数是相同的,那B+树就是这样的:

查找算法 | B+树详细分析

如图所示,B+树中含有两个头指针,一个指向整棵树的根结点,另一个指向关键字最小的叶子结点。同时所有的叶子结点依据其关键字的大小自小而大顺序链接,所有的叶子结点构成了一个 sqt 指针为头指针的链表。

所以,B+树可以进行两种查找运算:一种是利用 sqt 链表做顺序查找,另一种是从树的根结点开始,进行类似于二分查找的查找方式。

在 B+树中,所有非叶子节点都相当于是叶子节点的索引,而所有的关键字都存放在叶子节点中,所有在从根节点出发做查找操作时,如果非叶子节点上的关键字恰好等于给定值,此时并不算查找完成,而是要继续向下直到非叶子节点。

B+树的查找操作,无论查找成功与否,每次查找操作都是走了一条从根结点到叶子结点的路径。

向B+树中添加关键字时,也存在节点分裂的情况,在节点分裂时,会生成一个新的节点,把原节点中一半的元素复制到新节点,在父节点中添加指向新节点的关键字和指针。

继续阅读