在线性时间内将新字符串插入广义后缀树

Inserting new string to generalized suffix tree in linear time

如果我有一个广义后缀树,我想插入一个长度为m的新字符串,在O(m)中是否可行?

(树的总长度为M >> m

是的。如果您还不熟悉它,我建议您阅读有关 Ukkonen's algorithm.

的内容

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

  1. $ 附加到 S (即从现在开始我们认为 S$ 终止)
  2. 使用 S 的内容沿着树向下走,直到:
    1. S的内容已用尽:这意味着字符串S已经插入到
    2. 之前
    3. S 中的字符与树的内容不匹配

这第一步将引导您进入编辑树所需工作的起点。显然是线性的:O(k) 当不匹配发生在 S[=68= 的第 k 个字符处时].

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

  • 我们在一个节点中结束,找不到以 S 的第 k 个字符开始的转换。
  • 不匹配发生在转换的中间,即当前树中没有节点对应于新检测到的分支状态。

这一定会让你想起后缀树的迭代构造,就是这样:我们只需要指出起点并恢复树构造(这将处理这种二分法)。

所以你只需要重新构建 S 的树就好像 GST 是一个普通的 后缀树(1)。这个构造是 O(m-k),所以总复杂度是 O(m-k + k) = O(m)

(1):其实比那要复杂一点。在 Ukkonen 的算法中,由 Suffix Tree 表示的字符串 S 的子串基本上是一对索引 (start, end ) 表示所述子字符串的第一个和最后一个字符。当您考虑 GST 时,您需要一些额外的机制来保持 Ukkonen 的技巧,因为 您有 多个 字符串来引用。换句话说,子字符串需要附加到它们的引用字符串。有关此主题的更多信息