问题 特里与B +树


Trie和B +树如何比较按字典顺序排序的字符串[按数十亿的顺序]? 它也应该支持范围查询。

来自perf。以及实现复杂性的观点。


10357
2018-04-22 06:28


起源



答案:


我会说这取决于你的意思 范围

如果您的范围表示为 所有单词以。开头那么一个 Trie 是我说的正确选择。另一方面, Trie 不适合像这样的请求 XX和ZZ之间的所有单词

注意,分支因子 B+ Tree 影响其性能(中间节点的数量)。如果 h 是树的高度,然后是n最大 ~~ bH。因此h ~~ log(n最大)/ log(b)。

n = 1 000 000 000 和 b = 100, 我们有 h ~~ 5。因此,它意味着只有5个指针解除引用从根到叶。它比缓存更友好 Trie

最后, B+ Tree 无可否认,实施起来比实施起来更难 Trie:它更多的是 Red-Black Tree 复杂程度。


13
2018-04-22 07:33



如果你对你的Trie实现很聪明而不是“xx和zz之间的所有单词”并不那么困难。如果以字典顺序存储边缘,则字符串也按字典顺序排列。 - Niki Yoshiuchi
利用该范围有点困难。在一个 B+ Tree 一个范围可以由两个指针(开始/结束)定义,你可以像在双端队列中一样迭代它们。在一个 Trie 你必须实现迭代(从一个随机指针到另一个)以便能够做到这一点,它不太自然,虽然当然不可行,我担心效率会降低。或者您可以在另一个结构中复制范围,但这可能会很昂贵。 - Matthieu M.
错误地投票,应该投赞成票。我现在无法改变它:( - Suraj Chandran
@Suraj:我已经编辑了帖子(增加了一个空格)所以你通常应该可以改变你的投票:) - Matthieu M.


答案:


我会说这取决于你的意思 范围

如果您的范围表示为 所有单词以。开头那么一个 Trie 是我说的正确选择。另一方面, Trie 不适合像这样的请求 XX和ZZ之间的所有单词

注意,分支因子 B+ Tree 影响其性能(中间节点的数量)。如果 h 是树的高度,然后是n最大 ~~ bH。因此h ~~ log(n最大)/ log(b)。

n = 1 000 000 000 和 b = 100, 我们有 h ~~ 5。因此,它意味着只有5个指针解除引用从根到叶。它比缓存更友好 Trie

最后, B+ Tree 无可否认,实施起来比实施起来更难 Trie:它更多的是 Red-Black Tree 复杂程度。


13
2018-04-22 07:33



如果你对你的Trie实现很聪明而不是“xx和zz之间的所有单词”并不那么困难。如果以字典顺序存储边缘,则字符串也按字典顺序排列。 - Niki Yoshiuchi
利用该范围有点困难。在一个 B+ Tree 一个范围可以由两个指针(开始/结束)定义,你可以像在双端队列中一样迭代它们。在一个 Trie 你必须实现迭代(从一个随机指针到另一个)以便能够做到这一点,它不太自然,虽然当然不可行,我担心效率会降低。或者您可以在另一个结构中复制范围,但这可能会很昂贵。 - Matthieu M.
错误地投票,应该投赞成票。我现在无法改变它:( - Suraj Chandran
@Suraj:我已经编辑了帖子(增加了一个空格)所以你通常应该可以改变你的投票:) - Matthieu M.


取决于你的实际任务:

  • 如果你想得到 整个子树, 一个 B +树 是您的最佳选择,因为它节省空间。
  • 但是如果你想得到的话 第一 N 孩子 从一个子树,然后一个 特里 是最好的选择,因为您只访问比B + Tree场景更少的节点。
  • 最受欢迎的任务,由一个很好的处理 特里 是一个 单词前缀完成

3
2018-04-22 06:39



我正在使用的一些尝试变体不仅比BTrees更节省空间,而且对于大多数查询(直接访问,单词完成,范围查询)也更快。 - Mathieu Rodic


维基百科有一些算法复杂性事实: B +树 (部分特征), 特里 (不幸的是遍布整篇文章)。希望有所帮助。


0
2018-04-22 06:34