问题描述
我正在学习如何从给定字符串生成后缀树的 Ukkonen 算法。我在可视化网站http://brenden.github.io/ukkonen-animation/中尝试了一个字符串“dedododeodo”,我不完全理解的一件事是:为什么从节点号8到节点号3之间没有任何后缀链接?
我的理解是:路径标签是“od”,那么它应该链接到另一个节点“d”。这里的节点号 8 和节点号 3 都是内部节点。我不明白为什么从节点8到节点3没有后缀链接。
我知道后缀链接是在相内而不是相间生成的。但是,如果您转到 21 中的第 17 步,那么您很快就会看到与我相同的困惑。在字符'$'的rule-2扩展之后,我们应该遵循节点8的后缀链接,它根本不存在(或者可以说是指向root)。
可视化网站选择跳到节点3之后的边缘。
我在这里遗漏了什么吗?我从这个链接 Ukkonen's suffix tree algorithm in plain English 中了解到一个帖子,有时后缀链接不存在,所以我们必须从树的根部重新扫描。
如果作者说的是真的,那么它如何影响运行时复杂度?我的意思是,Ukkonen 算法的整个思想基于几个重要的技巧,其中之一就是后缀链接,对吗?
我读过一些关于线性时间复杂度证明的文章。后缀链接对于保证线性复杂度非常重要。使用后缀链接,节点深度最多下降2,树深度最多为n。有了这两个约束,我们可以说后缀树中“down-walk”的数量是有上限的。重新扫描后,线性时间复杂度将不再成立?
请帮忙。谢谢。我的实现 C++ 源代码在这里:https://github.com/hdc1112/SuffixTree