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


80

我正在阅读有关Tries通常称为Prefix树和的信息Suffix Trees
虽然我找到了的代码,Trie但找不到的示例Suffix Tree。我也感觉到,构建a的代码与a的代码Trie相同,Suffix Tree唯一的区别是,在前一种情况下,我们存储前缀,而在后缀中。
这是真的?谁能帮我解决这个问题?示例代码将对您有很大的帮助!


1
TL; DR字符串的后缀树是所有后缀的首字母缩写。唯一的特别之处是边缘标签是原始字符串的子字符串,因此它们可以表示为一对索引,并且仅占用恒定的空间。这也是为什么可以在线性时间内构建它的原因。
Niklas B.

Answers:


66

后缀树可以看做是建立在trie之上的数据结构,在该结构中,您不仅可以将字符串本身添加到trie中,还可以添加该字符串的所有可能的后缀。例如,如果要在后缀树中索引香蕉字符串,则可以使用以下字符串构建特里:

banana
anana
nana
ana
na
a

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

这是构建后缀树的最简单,最慢的方法。事实证明,此数据结构上有许多更高级的变体,它们既可以改善空间又可以改善构建时间。我对这一领域并不精通,没有一个概述,但是您可以从研究后缀数组或此类高级数据结构开始(第16和18节)。

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


这就是我所怀疑的。特里被用来构建后缀树,这就是为什么大多数教科书只提供尝试代码的原因。但这是最坏的情况吗?
Cratylus

@Cratylus后缀树在非常大的字符串(例如索引莎士比亚的所有作品)上最有用,其中O(n ^ 2)的空间和构建时间根本不会削减它。幸运的是,这些界限可以降低很多。
Ze Blob 2012年

8

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

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

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


2
因此,您是说后缀树和后缀尝试相同吗?
蝙蝠侠2014年

1

区别很简单。后缀树的“虚拟”节点少于后缀树。这些虚拟节点是单个字符,可增加在树上的查找操作


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.