从字符串S [1..m]的后缀树生成字符串S [2..m]的后缀树

时间:2013-05-06 21:29:10

标签: algorithm data-structures complexity-theory suffix-tree

是否存在从字符串S [1..m]的后缀树生成suffix tree字符串S [2..m]的快速(O(1)时间复杂度)方法?

我熟悉Ukkonen,所以我知道如何从字符串S [1..m]的后缀树制作字符串S [1..m + 1]的快速后缀树,但是我不能应用算法反向情况。

1 个答案:

答案 0 :(得分:1)

好吧,正如@jogojapan所说,要从S [1..m]树中获取S [2..m]树,我们需要:

  • 找到位置0叶 L
  • 如果 L 有多个兄弟,请将指针从 L 的父级删除到 L
  • 如果 L 只有一个兄弟,请将指针从 L 的祖父母改为 L 的父母,这样它就指向< em> L 的兄弟姐妹。

@jogojapan进一步建议您保留指向树中最深叶的指针。有两个问题: L 不一定是树中最深的叶子,如Wikipedia's example shows,第二个如果你想能够输出相同类型的数据结构你收到了,一旦删除 L ,你需要找到 new position-0 leaf,无论如何都要花费O(m)时间。

(你可以做的是在O(m)时间内构造一个指向每个叶子的指针数组,并在另一个O(m)时间内按位置对它们进行排序。然后你就可以构造所有的树< em> {S [t..n]:1&lt; = t&lt; = m} ,每次的摊还时间不变。

假设你对摊销时间不感兴趣,那就让我们证明你的要求是不可能的。

  • 我们知道任何修改S [1..m]后缀树的算法必须从根开始:它不能在其他地方启动,因为我们对底层具体数据结构一无所知,我们不知道树的节点有指针,因此整个树可以从中访问的唯一位置是根。
  • 我们也知道它必须找到位置0叶子才能希望将数据结构修改为S [2..m]的后缀树。为此,它必须显然遍历根和位置0叶之间的每个节点。
  • 事情是,考虑 a ^ m 的后缀树(字符 a 重复 m 次):路径的长度是 m-1个。因此,任何算法必须至少访问 m-1 节点,因此在最坏的情况下需要花费O(m)时间。