Suffix tree and Tries. What is the difference?
我在读关于
后缀树可以被看作是一个建立在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少。这些虚拟节点是增加树上查找操作的单个字符