B+树相对于BST的优势?

Posted

技术标签:

【中文标题】B+树相对于BST的优势?【英文标题】:Advantage of B+ trees over BSTs? 【发布时间】:2013-03-07 06:50:30 【问题描述】:

我在关于数据库的课程中学习 B+ 树,我想知道 B+ 树相对于二叉搜索树有哪些具体优势?

对于大多数值得注意的操作,它们似乎都具有 O(logN) 平均复杂度,但 B+ 树在每个子节点上也有额外的(可以忽略不计?)搜索时间,而 BST 显然只需要 O(1) 时间来计算要前进到哪个子节点。

哪些实际优势使 B+ 树在数据库中比 BST 更受欢迎?

【问题讨论】:

【参考方案1】:

与二叉搜索树相比,B+ 树(以及一般的 B 树)的主要优势在于它们可以很好地处理缓存。如果你有一棵二叉搜索树,它的节点在内存中以或多或少的随机顺序存储,那么每次你跟随一个指针时,机器都必须将一个新的内存块拉入处理器缓存,这比访问已在缓存中的内存。

B+-tree 和 B-tree 通过让每个节点存储大量键或值并拥有大量子节点来工作。它们通常以某种方式打包在一起,使单个节点可以很好地放入缓存中(或者,如果存储在磁盘上,则可以在单个读取操作中从磁盘中提取)。然后您必须做更多的工作才能在节点中找到一个键或确定接下来要读取哪个子节点,但是由于在单个节点上完成的所有内存访问都可以在不返回磁盘的情况下完成,因此访问时间非常短。这意味着即使原则上 BST 在内存访问次数方面可能会更好,但 B+-tree 和 B-tree 在 runtime方面可以表现更好> 那些内存访问。

B+-tree 或 B-tree 的典型用例是在数据库中,其中包含大量信息并且数据非常多,以至于无法全部放入主内存中。因此,数据可以存储在硬盘上某处的 B+-tree 或 B-tree 中。这最大限度地减少了在查找期间拉入数据所需的磁盘读取次数。一些文件系统(比如 ext4,我相信)出于同样的原因也使用 B-tree - 它们最大限度地减少了必要的磁盘查找次数,这是真正的瓶颈。

希望这会有所帮助!

【讨论】:

我无法理解“B 树在这些内存访问的运行时间方面可以表现得更好”的说法。你能解释一下吗? @Xylene23 由于缓存影响,并非所有内存访问都需要相同的时间来完成。 A BST 在查找时接触的内存位置比 B 树少,但这些访问的成本很高,因为每次访问都可能导致缓存未命中。 A B 树涉及更多的总内存位置,但这些访问的成本较低,因为缓存未命中的次数会更少。 感谢您的解释。【参考方案2】:

现实生活中的数据存储(例如,在 DB 中)需要存储大量数据。由于数据检索是关注的基本操作,因此从磁盘读取数据比从 RAM 读取数据相当耗时。

现在,这就是问题所在……

与 B+ 树相比,BST 在节点中存储的数据较少。这导致 BST 的高度高于 B+ 树。因此它们存储在磁盘上而不是 RAM 上。

每次必须从树中检索数据时,都必须将磁盘中的数据加载到主内存中(这当然是一个耗时的过程),而对于 B+ 树,数据已经存在于 RAM 中,直接获取所需节点并从可能包含许多子节点的节点检索数据(但在 B+ 树的情况下,数据检索的总时间较短,因为不需要将数据从磁盘加载到内存)。

【讨论】:

以上是关于B+树相对于BST的优势?的主要内容,如果未能解决你的问题,请参考以下文章

树:BSTAVL红黑树B树B+树

链表相对二叉树的优势?

870. 优势洗牌

Leetcode(870)-优势洗牌

树:BSTAVL红黑树B树B+树

Spark相对于MapReduce的优势