Data structures 在线性时间向广义后缀树插入新字符串

Data structures 在线性时间向广义后缀树插入新字符串,data-structures,suffix-tree,Data Structures,Suffix Tree,如果我有一个通用后缀树,并且我想插入一个长度为m的新字符串,是否可以在O(m)中插入 (树中的总长度为M>>M)是的。如果你还不熟悉,我建议你读一下 现在假设您有一个包含N个字符串的通用后缀树(从现在开始表示为GST)。然后,您希望插入第N+1个字符串S。我将假定您已经为字符串定义了一个终端字符(例如,$),并且在输入字符串中永远不会遇到该字符 追加 $到S(即从现在开始,我们认为S是代码> $< /代码>终止) 使用S的内容沿树向下走,直到: S的内容已用尽:这意味着字符串S之前已插入 S中的

如果我有一个通用后缀树,并且我想插入一个长度为
m
的新字符串,是否可以在
O(m)
中插入


(树中的总长度为
M>>M

是的。如果你还不熟悉,我建议你读一下

现在假设您有一个包含N个字符串的通用后缀树(从现在开始表示为GST)。然后,您希望插入第N+1个字符串S。我将假定您已经为字符串定义了一个终端字符(例如,
$
),并且在输入字符串中永远不会遇到该字符

追加<代码> $<代码>到S(即从现在开始,我们认为S是代码> $< /代码>终止)
  • 使用S的内容沿树向下走,直到:
  • S的内容已用尽:这意味着字符串S之前已插入
  • S中的字符与树的内容不匹配
  • 这第一步将引导您到达编辑树所需的起点。当S的第k个字符出现不匹配时,它明显是线性的:O(k)

    让我们假设S之前没有插入。不匹配可能以以下方式之一发生:

    • 我们最终在一个节点中,找不到以S的第k个字符开始的转换
    • 不匹配发生在过渡的中间,即当前没有对应于新检测到的分支状态的树中的节点。
    这必须提醒您后缀树的迭代构造,这正是它:我们只需要指出起点并恢复树构造(这将处理这种二分法)

    因此,您只需恢复S的树的构造,就好像GST是一个常见的后缀树一样(1)。这个结构是O(m-k),所以总的复杂度是O(m-k+k)=O(m)

    (1):事实上,它比这要复杂一点。在Ukkonen算法中,后缀树表示的字符串s的子字符串基本上是一对索引(开始、结束),表示所述子字符串的第一个和最后一个字符。当你考虑一个GST时,你需要一些额外的机器来保持Ukkonen的技巧,因为你有一个以上的<强>字符串引用。换句话说,子字符串需要附加到其引用字符串。更多关于这个话题