C++ 使用B树和B+-树

C++ 使用B树和B+-树,c++,tree,b-tree,C++,Tree,B Tree,我正在编写一个程序来检索给定范围内的对象数量,并且我正在使用B-树数据结构来实现我的解决方案,因为对象的数量不适合RAM。我曾读过几篇文章说,对于范围查询,B+树远远优于B-树,并且被所有主要的数据库实现使用。我无法理解为什么B+树优于B-树,因为所有数据都存储在叶子上,需要h(树的高度)磁盘访问来检索节点并执行范围查询,而在B-树中,间隔可能位于父节点上,因此磁盘访问将最小化。此外,如果我有一个查询,例如返回某个特定键的对象,那么我可能能够在一直下降到叶子之前找到该键,就像在B+树中一样。那么

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

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

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

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

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

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

为了让这一理论落空,我们需要估计B树的内部节点上总共有多少个键,以及叶子节点上总共有多少个键。这个比率告诉您搜索可以提前停止的频率,然后再一直下降到叶子级别。注意:提前退出场景仅适用于恰好在树中存在确切键的查询;否则,一个像样的叶子水平是不可避免的