我正在阅读有关Tries
通常称为Prefix树和的信息Suffix Trees
。
虽然我找到了的代码,Trie
但找不到的示例Suffix Tree
。我也感觉到,构建a的代码与a的代码Trie
相同,Suffix Tree
唯一的区别是,在前一种情况下,我们存储前缀,而在后缀中。
这是真的?谁能帮我解决这个问题?示例代码将对您有很大的帮助!
Answers:
后缀树可以看做是建立在trie之上的数据结构,在该结构中,您不仅可以将字符串本身添加到trie中,还可以添加该字符串的所有可能的后缀。例如,如果要在后缀树中索引香蕉字符串,则可以使用以下字符串构建特里:
banana
anana
nana
ana
na
a
完成后,您可以搜索任何n-gram,然后查看它是否存在于索引字符串中。换句话说,n-gram搜索是字符串的所有可能后缀的前缀搜索。
这是构建后缀树的最简单,最慢的方法。事实证明,此数据结构上有许多更高级的变体,它们既可以改善空间又可以改善构建时间。我对这一领域并不精通,没有一个概述,但是您可以从研究后缀数组或此类高级数据结构开始(第16和18节)。
这个答案也很好地解释了这种数据结构的变体。
如果您想象一个Trie,其中放置了一些单词的后缀,则可以非常容易地查询字符串的子字符串。这是后缀树的主要思想,基本上是“后缀树”。
但是,使用这种幼稚的方法,为大小为n的字符串构造该树将是O(n ^ 2)并占用大量内存。
由于该树的所有条目都是相同字符串的后缀,因此它们共享许多信息,因此有优化的算法可让您更有效地创建它们。例如,Ukkonen的算法允许您以O(n)时间复杂度在线创建后缀树。
Trie的节点具有指向较短上下文的链接,而“ Tree”则没有。如果Tree的节点链接到较短的上下文,则转向Trie; o)