尝试与三元搜索树进行自动完成?

时间:2012-06-10 16:42:26

标签: string algorithm data-structures autocomplete trie

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

  1. 如果尝试空间效率低,并且TST结合了最好的BST和尝试,这是否意味着尝试几乎根本不使用?

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

1 个答案:

答案 0 :(得分:17)

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

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

所以在排序中,两种结构都不比其他结构严格好。这取决于存储的单词。

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

至于如何构建它们 - 尝试和三元搜索树都支持有效插入单个单词。它们不需要事先用固定的单词构建。

希望这有帮助!