【发布时间】:2021-09-26 17:24:23
【问题描述】:
我正在学习如何从给定字符串生成后缀树的 Ukkonen 算法。我在可视化网站http://brenden.github.io/ukkonen-animation/中尝试了一个字符串“dedododeodo”,我不完全理解的一件事是:为什么从8号节点到3号节点没有任何后缀链接?
我的理解是:路径标签是“od”,那么它应该链接到另一个节点“d”。这里的节点 8 和节点 3 都是内部节点。我不明白为什么节点8到节点3没有后缀链接。
我知道后缀链接是在相内而不是相间生成的。但是如果你走到 21 的第 17 步,那么你很快就会对我产生同样的困惑。在字符'$'的规则2扩展之后,我们应该遵循节点8的后缀链接,它根本不存在(或者你可以说指向root)。
可视化网站选择在节点3之后跳转到边缘。
我在这里遗漏了什么吗?我从这个链接Ukkonen's suffix tree algorithm in plain English了解到一篇帖子有时后缀链接不存在,所以我们必须从树的根部重新扫描。
如果作者说的是真的,那么它如何影响运行时复杂度?我的意思是,Ukkonen 算法的整个思想是基于几个重要的技巧,其中之一就是后缀链接,对吧?
我读过一些关于线性时间复杂度证明的文章。后缀链接对于保证线性复杂度非常重要。使用后缀链接,节点深度最多下降2,树深度最多为n。有了这两个约束,我们可以说后缀树中“向下行走”的数量是有上限的。重新扫描后,线性时间复杂度将不再成立?
请帮忙。谢谢。我的实现 C++ 源代码在这里:https://github.com/hdc1112/SuffixTree
【问题讨论】:
-
嗯,这很奇怪。我也希望在那里看到一个后缀链接。
-
我刚刚又看了一遍Gusfield G的书,发现后缀链接不仅是从之前创建的内部节点创建到新创建的内部节点,而且是从新创建的内部节点创建的到找到的内部节点(已经存在)。因此,在我看来,“重新扫描”的说法是没有根据的。 “每个内部节点”都有一个后缀链接的说法仍然成立。随时纠正我。我修复了这个错误,链接的源代码应该反映了 Ukkonen 算法的正确实现(如果没有其他错误..)
标签: suffix-tree