关于算法:后缀树和尝试。

Suffix tree and Tries. What is the difference?

我在读关于Tries,通常被称为前缀树和Suffix Trees。虽然我已经找到了Trie的代码,但我找不到Suffix Tree的示例。另外,我觉得构建Trie的代码与Suffix Tree的代码相同,唯一不同的是,在前一种情况下,我们存储前缀,但在后一种后缀中。这是真的吗?有人能帮我把这件事在脑子里说清楚吗?一个示例代码会很有帮助!


后缀树可以被看作是一个建立在trie之上的数据结构,在这个结构中,除了将字符串本身添加到trie之外,还可以添加该字符串的所有可能后缀。例如,如果要在后缀树中索引字符串banana,则需要使用以下字符串构建trie:

1
2
3
4
5
6
banana
anana
nana
ana
na
a

完成后,您可以搜索任何n-gram并查看它是否存在于索引字符串中。换句话说,n-gram搜索是对字符串所有可能后缀的前缀搜索。

这是构建后缀树最简单、最慢的方法。事实证明,在这种数据结构上,有许多更高级的变体可以改进空间和构建时间。我对这个领域还不够了解,无法给出一个概述,但是您可以从后缀数组或这个类的高级数据结构开始(第16和18课)。

这个答案也能很好地解释这种数据结构的变体。


如果您想象一个trie,在其中放置一些单词的后缀,您将能够非常容易地查询字符串的子字符串。这是后缀树背后的主要思想,它基本上是一个"后缀trie"。

但是使用这种幼稚的方法,为大小为n的字符串构造这棵树将是O(n^2),并且需要大量的内存。

因为这棵树的所有条目都是相同字符串的后缀,所以它们共享很多信息,所以有一些优化算法可以让您更有效地创建它们。例如,Ukkonen的算法允许您在O(N)时间复杂度下在线创建后缀树。


区别很简单。后缀树的"伪"节点比后缀trie少。这些虚拟节点是增加树上查找操作的单个字符