引言

树作为可以大幅度缩小查找时间复杂度的数据结构,有很多变种。我们熟悉的二叉查找树查找的时间复杂度为O(logN)。为了维持二叉树的高度,人们开发出了平衡二叉树,这样能够将搜索的时间复杂度控制在O(logN)。然而平衡二叉查找树为了维持平衡,需要不断检测自己的结构是否平衡,若非平衡结构,则需要不断维护结构达到新的平衡,动态插入和删除的代价也随之增加。另外,二叉查找树虽然在时间复杂度方面表现很出色,但是会涉及到比较高的磁盘IO成本。当大量数据存储时,如果每次磁盘IO只得到一个节点的数据,二叉查找树将会有巨量的磁盘IO次数,造成巨大的代价。为了减少磁盘IO次数,必须降低树的深度,有两个思路。
(1)二叉树变为多叉树减小树的深度。
(2)将多个数据存储于一个一个节点中

B树

B树的定义

根据《算法导论》中的定义,设 t 为B树的最小度,一颗最小度为 t 的B树满足以下条件:

  • 每个节点最少包含 t - 1 个数据,最多包含 2t - 1 个数据,根节点至少包括1个数据。
  • 每个节点中的数据都按照非降序排列。
  • 每个节点中的数据都会完成对子树的范围切割。若节点有 n 个数据,则会有 n + 1 个指针指向 n + 1 个子树。
  • 所有叶子节点的深度是一样的,为树的高度,代表着B树的平衡。

B树结构:
B树,B+树和红黑树

通常我们都将节点容量设置为数据表一页的大小,这样每次磁盘IO读取一个节点内的数据,正好会是一页的数据。B树正是通过这样的手段有效减少节点数,从而减少磁盘IO次数,从而提高在大量数据情况下的查找效率。

搜索

这里引用博客从B树、B+树、B*树谈到R 树中的B树图片来讲解B树搜索。让我们尝试找到数据60。
B树,B+树和红黑树

这里看一下这张图片中B树的结构,每一个节点中的内容存储在一个磁盘块中。每个节点中:

  • 蓝色代表的是数据字段。
  • 红色代表的是该数据的存储地址。
  • 黄色则代表指针。

数据,指针,数据的存储地址构成了B树的节点,共同存放于磁盘块中。

接下来解释搜索数据60的过程:

  1. 从根节点开始,读取根节点信息,根节点有2个关键字:17和35。因为 35 < 60,所以找到指针P3指向的子树,也就是磁盘块4(1次I/0操作)
  2. 读取当前节点信息,当前节点有2个关键字:65和87。60 < 65,找到指针P1指向的子树,也就是磁盘块9(2次I/0操作)
  3. 读取当前节点信息,当前节点有2个关键字:36和60。检索得到数据60.(3次I/0操作)

由上面的过程可见,同样的操作,如果使用平衡二叉树,那么需要至少4次I/O操作,B树比之二叉树的这种优势,还会随着节点数的增加而增加。另外,因为B树节点中的关键字都是排序好的,所以,在节点中的信息被读入内存之后,可以采用二分查找这种快速的查找方式,更进一步减少了读入内存之后的计算时间,由此更能说明对于外存数据结构来说,I/O次数是其查找信息中最大的时间消耗,而我们要做的所有努力就是尽量在搜索过程中减少I/O操作的次数。

B+树

B+树定义

B+树是B树的变形,是和B树一样常被用于数据库索引的数据结构。设 * m * 为B+树的阶数,符合以下条件:

  • 每个节点最多有 m 个数据,最少有 m/2 个数据,其中每个关键字对应一个子树。
  • 根节点至少有2棵子树
  • 所有的叶子节点包含了全部的数据以及这些数据指向文件的指针,并且所有叶子节点中的关键字按大小顺序排列
  • 所有的叶子节点中相邻的叶子节点顺序链接
  • 所有的叶子节点同一层
  • 所有分支节点的数据都是对应子树中关键字的最大值

B+树如图:
B树,B+树和红黑树

B+树与B树结构上的区别

  1. B+树节点中数据的数量和指针的数量是相同的,B树的指针数量总是比数据数量多1.
  2. B+树所有的数据均存在叶子节点中,内部节点只是索引作用
  3. 当在搜索过程中在内部节点找到目标数据,搜索过程不停止,将会继续向下搜索到叶子节点中的目标数据

B+树的优势

  1. B+树磁盘读写代价更低
    B+树节点中没有指向关键字具体信息的指针,因此相较于B树节点较小,相同的磁盘块能容纳的数据更多,一次性读入内存的数据更多,磁盘IO读写次数也就更少。

  2. B+树的查询效率更稳定
    由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

  3. B+树更有利于对数据库的扫描
    B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题,而B+树只需要遍历叶子节点就可以解决对全部关键字信息的扫描,所以对于数据库中频繁使用的range query,B+树有着更高的性能。

红黑树

待续

相关文章: