【问题标题】:Tries versus ternary search trees for autocomplete?自动完成的尝试与三元搜索树?
【发布时间】:2012-06-10 16:42:26
【问题描述】:

我经历了尝试和三元搜索树,我对它们有一些疑问。我已经用谷歌搜索了答案,但我无法得到具体的答案。所以,这是我的问题。

  1. 如果尝试空间效率低且 TST 结合了 BST 和尝试的优点,这是否意味着实际上根本不使用尝试?

  2. 假设 TST 用于自动完成,..在 Google 的情况下如何工作?我的意思是实际上我们没有一组固定的单词等,..那么如何构建 TST 的树?

【问题讨论】:

  • 您是否也调查过 Patricia Tries?似乎它们是 Trie 和 TST 之间的中间地带。

标签: string algorithm data-structures autocomplete trie


【解决方案1】:

尝试和三元搜索树代表了时间/空间的权衡。如果您的字母表中有 k 个符号,则 trie 中的每个节点都包含 k 个指针加上一个额外的位,用于该节点是否对单词进行编码。查找长度为 L 的单词总是需要时间 O(L)。三元搜索树为每个节点存储三个指针,加上一个字符和一个位,用于判断该节点是否对一个词进行编码。查找长度为 L 的单词需要时间 O(L log k)。 (如果你有一个静态的三元搜索树,你可以使用weight-balanced trees 构建 TST,这将查找时间缩短到 O(L + log k),但插入的代价非常高。)

对于 trie 中的每个节点都使用其大部分子节点的情况,Trie 比三叉搜索树的空间效率和时间效率要高得多。如果每个节点存储的子节点相对较少,则三叉搜索树的空间效率要高得多。一般来说,尝试比三元搜索树快得多,因为需要的指针间接更少。

所以在排序上,没有一种结构严格来说比另一种更好。这取决于存储的单词。

为了混淆一点,简洁的尝试开始成为上述两种方法的可行替代方案。尽管查找时间往往要慢得多,但它们的空间利用率比尝试更好。同样,它们是否比其他两个选项更好或更差取决于应用程序。

至于如何构建它们 - 尝试和三元搜索树都支持单个单词的有效插入。它们不需要预先从一组固定的单词中构建出来。

希望这会有所帮助!

【讨论】:

  • 对于 Trie 中的每个节点都使用其大部分子节点的情况,Trie 比三元搜索树的空间效率和时间效率要高得多。如果每个节点存储的子节点相对较少,则三叉搜索树的空间效率更高。Trie 的情况下,每个节点最多可以有 k 个指针,这意味着大量的内存和空间效率低下。但是在每个节点的子节点很少的情况下,使用列表或映射等动态集合而不是数组可以节省空间。因此,即使每个节点的子节点很少,Tries 在空间方面也没有那么糟糕。
  • @MeenaChaudhary 确实如此,尽管这些数据结构的时间效率低于标准数组。一切都是权衡!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2014-06-15
  • 2015-07-20
  • 1970-01-01
相关资源
最近更新 更多