【问题标题】:How to calculate that a B+ tree is O(log(n)) for lookups如何计算 B+ 树的查找时间为 O(log(n))
【发布时间】:2012-05-19 20:08:31
【问题描述】:

我正在研究用于索引的 B+树,并且我尝试理解的不仅仅是记住结构。据我了解,B+树的内部节点在叶子上形成一个索引,叶子包含指向数据在磁盘上存储位置的指针。正确的?那么查找是如何进行的呢?如果 B+tree 比二叉树好很多,为什么我们不到处使用 B+tree 而不是二叉树呢?

我阅读了有关 B+ 树的 wikipedia 文章,我了解其结构,但不了解实际查找的执行方式。您能否指导我提供一些阅读材料的链接?

除了数据库索引之外,B+ 树还有哪些其他用途?

【问题讨论】:

  • 这些问题很多。我研究过这个东西,但是,我几乎什么都不记得了。
  • 我认为不能说“B+树比二叉树好”。 B+树主要用于必须将读写操作保持在最低限度的情况,因为信息被“打包”在块中。这就是为什么您会看到它们在数据库索引中大量使用,而不是作为“内存中”数据结构使用。
  • 即使在“内存中”数据结构上,二叉树也会导致过多的地址间接性,所以即使在“内存中”数据库上,b+tree 也是首选,我猜“内存中”二叉树相当不错对于不需要高性能功能的应用程序,b+tree 肯定是更复杂的结构,在这些情况下,是的,二叉树是首选。

标签: algorithm tree indexing b-tree


【解决方案1】:

B+ 树比二叉树好,所有 dbms 都使用它们,

在 B+Tree 中查找 LOGF N 是 F 的基数和扇出。查找的执行方式与二叉树完全一样,但扇出更大,高度更低,这就是为什么它更好。

B+Tree 通常以在叶子中拥有数据而闻名(如果它们是非集群的,则可能不是),这意味着您不必再次跳转到磁盘来获取数据,您只需从叶子中获取数据。

B+Tree 几乎无处不在,操作系统使用它们,数据仓库(这里不多,但仍然如此),许多应用程序。

B+Tree 非常适合范围查询,只要您有唯一值(例如主键或任何低基数的字段),就会使用 B+Tree。

如果你能得到这本书http://www.amazon.com/Database-Management-Systems-Raghu-Ramakrishnan/dp/0072465638 它是最好的之一。它基本上是任何数据库人的圣经。

【讨论】:

  • -1 这个答案非常具有误导性——它看起来好像 B+ 树总是优于 BST,而实际上 BST 几乎总是更可取。唯一需要 B+ 树的情况是当您无法将整个树存储在内存中时 - 那么 B+ 树更可取,因为您可以使每个节点的大小为硬盘驱动器扇区的大小以优化从磁盘读取。我所知道的唯一真正的应用程序是数据库和文件系统。
  • 为反对票感到高兴,我想,在大多数情况下,当你想要高性能时,B+Tree 是首选,也许我应该补充一下。 BST 因其简单性而受到青睐,但是一旦您进入数百万个数据,即使在“内存中”应用程序中,BST 也不会有意义。再次针对高性能应用程序,我同意 90% 的应用程序类型是 dbs 和文件系统
  • @BlueRaja-DannyPflughoeft:实际上我更喜欢 B+Trees 而不是 BSTs。它们具有更少的内存开销和更好的缓存行为。一个缺点是缺乏内存稳定性:即,插入一个对象可能会在内存中移动其他对象。
【解决方案2】:

我正在研究用于索引的 B+树,并且我尝试理解的不仅仅是记住结构。据我了解,B+树的内部节点在叶子上形成一个索引,叶子包含指向数据在磁盘上存储位置的指针。对吗?

不,索引是由 inner 节点(非叶子)形成的。根据实现,叶子可能包含键/值对或键/指向值对的指针。例如,数据库索引使用后者,除非它是 IOT(索引组织表),在这种情况下,值内联在叶子中。这主要取决于键的值是否非常大。

那么查找是如何进行的呢?

在根节点不是叶子的一般情况下(起初确实会发生),根节点包含一个由 N 个键和 N+1 个指针组成的排序数组。您对两个键 S0 和 S1 进行二分搜索,使得 S0 <= K < S1(其中 K 是您要查找的内容),这将为您提供指向下一个节点的指针。

你重复这个过程,直到你(最终)找到一个叶子节点,它包含一个排序的键值对列表,然后对这些进行最后的二分搜索。

如果 B+树比二叉树好得多,为什么我们不到处使用 B+树而不是二叉树?

  • 二叉树更容易实现。一个带有 B+Trees 的 cookie 是调整内部节点中键/指针的数量和叶节点中键/值对的数量。另一个虽然 cookie 是决定导致两个节点分组或爆炸一个节点的低水位线和高水位线。
  • 二叉树还提供内存稳定性:插入的元素在内存中根本不会移动。另一方面,在 B+Tree 中插入一个元素或删除一个元素可能会导致元素混洗
  • B+Trees 是为小键/大值的情况量身定制的。它们还要求可以复制密钥(希望成本低廉)。

您能否指导我提供一些阅读材料的链接?

希望我解释的粗略算法有所帮助,否则请在 cmets 中提问。

除了数据库索引之外,B+ 树还有哪些其他用途?

同样:文件系统索引也有好处。

这个想法总是一样的:B+Tree 非常适合小键/大值和缓存。这个想法是在你的 fast 内存(CPU 缓存 >> RAM >> 磁盘)中拥有所有键(内部节点),并且 B+Tree 通过将键推到底部来实现大型集合.由于所有内部节点都在快速内存中,每次搜索时您只有一次慢速内存访问(以获取值)。

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多