使用 B 树和 B+ 树的范围查询

jac*_*ope 3 c++ tree b-tree

我正在编写一个程序来检索给定范围内的对象数量,并且我正在使用 B 树数据结构来实现我的解决方案,因为对象数量无法容纳在 RAM 中。我看到几篇文章说 B+ 树在范围查询方面远远优于 B 树,并且被所有主要数据库实现所使用。我无法理解为什么B+树比B树优越,因为所有数据都存储在叶子上,并且需要h(树的高度)磁盘访问来检索节点并执行范围查询,而在B树中间隔可以位于父节点上,因此磁盘访问将被最小化。此外,如果我有一个查询,例如返回特定键的对象数,那么我可能能够在像 B+ 树一样一路下降到叶子之前找到该键。那么为什么他们说 B+ 树对于范围查询比 B 树更高效呢?如果我必须编写一个程序来执行范围查询,B 树不应该是正确的数据结构吗?提前感谢您的回复!

Dar*_*zka 6

实际的 B 树和 B+ 树实现往往具有固定字节大小的节点,该节点被选择为与体系结构的页面大小或其他固定装置(如磁盘上的簇大小)相匹配。典型值是 4096 字节。

B+树可以在内部节点中容纳更多的键,因为记录数据不需要空间。这提供了更高的扇出(更低的树高度)和更好的缓存利用率,因为给定的一组索引页(内部节点)比 B 树“覆盖”更多的查询。

B+ 树的第二个优点是内部节点中的键仅用于将搜索路由到右叶。他们只需要将左边的东西和右边的东西分开,但它们不必对应于任何实际的记录键。这意味着它们通常可以被缩短,也意味着删除不必从叶层传播到索引层(即,一旦从叶中删除了一个键,就完成了 - 不需要从内部节点删除任何内容,除了重新平衡期间自然发生的内容)。

此外,在典型的 B+ 树中,叶节点具有指向其左兄弟节点和右兄弟节点的指针。这意味着您可以通过遍历页面的链接列表来迭代一系列记录,而不必使用 B 树典型的棘手迭代逻辑。

在B树中,间隔可能位于父节点上,因此磁盘访问将被最小化

为了证实这一理论,请估计 B 树的内部节点中总共有多少个键以及叶节点中总共有多少个键。该比率告诉您搜索在一路下降到叶级别之前提前停止的频率。注意:提前退出场景仅适用于树中恰好存在确切键的查询;否则下降到叶子高度是不可避免的。