Algorithm 后缀树并尝试。有什么区别?

Algorithm 后缀树并尝试。有什么区别?,algorithm,data-structures,trie,suffix-tree,Algorithm,Data Structures,Trie,Suffix Tree,我正在阅读有关尝试常见的前缀树和后缀树 虽然我找到了Trie的代码,但我找不到后缀树的示例。我还觉得构建Trie的代码与后缀树的代码相同,唯一的区别是前者存储前缀,而后者存储后缀。 这是真的吗?有人能帮我把这件事弄清楚吗?一个示例代码将非常有帮助 后缀树可以被视为构建在trie之上的数据结构,其中,除了将字符串本身添加到trie中,还可以添加该字符串的所有可能后缀。例如,如果您想在后缀树中索引字符串banana,您可以使用以下字符串构建一个trie: banana anana nana ana

我正在阅读有关
尝试
常见的前缀树和
后缀树

虽然我找到了
Trie
的代码,但我找不到
后缀树的示例。我还觉得构建
Trie
的代码与
后缀树的代码相同,唯一的区别是前者存储前缀,而后者存储后缀。

这是真的吗?有人能帮我把这件事弄清楚吗?一个示例代码将非常有帮助

后缀树可以被视为构建在trie之上的数据结构,其中,除了将字符串本身添加到trie中,还可以添加该字符串的所有可能后缀。例如,如果您想在后缀树中索引字符串banana,您可以使用以下字符串构建一个trie:

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

这是构建后缀树最简单也是最慢的方法。事实证明,在这个数据结构上有许多更奇特的变体,它们在空间和构建时间上都有所改进。我对这一领域的知识还不够精通,不能给出一个概述,但你可以从这门课开始(第16课和第18课)


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

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

但是使用这种简单的方法,为大小为n的字符串构建此树将是O(n^2),并且需要大量内存


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

区别非常简单。后缀树的“虚拟”节点数少于后缀trie。这些虚拟节点是增加树上查找操作的单个字符

Trie的节点具有指向较短上下文的链接,“树”没有它。若树的节点得到了到较短上下文的链接,那个么它将转向Trie;o) 给定文本的后缀树是给定文本的所有后缀的压缩trie


Ref:

这就是我所怀疑的。trie用于构建后缀树,这就是为什么大多数教科书只提供用于尝试的代码。但这是最糟糕的实现,呃?@Cratylus后缀树在非常大的字符串(例如索引莎士比亚的所有作品)上最有用,其中O(n^2)空间和构建时间根本不会减少它。幸运的是,这些界限可以降低很多。所以你说后缀树和后缀尝试是一样的?TL;DR字符串的后缀树是其所有后缀的集合。它唯一的特殊之处在于边缘标签是原始字符串的子字符串,因此它们可以表示为一对索引,并且只占用常量空间。这也是为什么它可以在线性时间内构建。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效-