后缀树和尝试。 有什么不同?

我正在阅读关于前缀树和Suffix Trees Tries
虽然我找到了一个Trie代码,但我找不到Suffix Tree的示例。 此外,我感觉到构建Trie的代码与Suffix Tree的代码相同,唯一的区别在于前一种情况下我们存储前缀,但存储后缀后缀。
这是真的? 任何人都可以帮我在我的脑海中清楚这一点吗? 示例代码将非常有帮助!


后缀树可以被看作是一个建立在trie之上的数据结构,而不是仅仅将字符串本身添加到trie中,而是添加该字符串的每个可能的后缀。 举个例子,如果你想在后缀树中索引字符串香蕉 ,你可以使用下列字符串构建一个trie:

banana
anana
nana
ana
na
a

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

这是构建后缀树最简单和最慢的方法。 事实证明,这个数据结构中有许多更好的变体,可以改善空间和构建时间。 我在这个领域中不够精通,没有给出一个概述,但是您可以先查看后缀数组或这个类的高级数据结构(第16和18课)。

这个答案也可以解释这个数据结构的一个变种。


如果你想象一个Trie,你在其中放置了一些单词的后缀,你可以很容易地查询它的字符串的子串。 这是后缀树的主要思想,它基本上是一个“后缀树”。

但是,使用这种天真的方法,构造一棵大小为n的字符串树将是O(n ^ 2)并占用大量内存。

由于该树的所有条目都是相同字符串的后缀,因此它们共享大量信息,所以有优化的算法可以让您更高效地创建它们。 例如,Ukkonen的算法允许您以O(n)时间复杂度在线创建后缀树。


差异很简单。 后缀树比后缀trie具有更少的“虚拟”节点。 这些虚拟节点是单个字符,用于增加树中的查找操作

链接地址: http://www.djcxy.com/p/40077.html

上一篇: Suffix tree and Tries. What is the difference?

下一篇: Complexity of two cumulative sum (cumsum) functions in Haskell