在线性时间内将新字符串插入广义后缀树
Inserting new string to generalized suffix tree in linear time
如果我有一个广义后缀树,我想插入一个长度为m
的新字符串,在O(m)
中是否可行?
(树的总长度为M >> m
)
是的。如果您还不熟悉它,我建议您阅读有关 Ukkonen's algorithm.
的内容
现在假设你有一个广义后缀树(从现在开始表示为GST)包含N 字符串。然后,您想插入第 N+1 个字符串 S。我假设您已经为您的字符串定义了一个终端字符(例如 $
),并且您的输入字符串中永远不会遇到这个字符。
- 将
$
附加到 S (即从现在开始我们认为 S 被 $
终止)
- 使用 S 的内容沿着树向下走,直到:
- S的内容已用尽:这意味着字符串S已经插入到
之前
- 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 的技巧,因为 您有 多个 字符串来引用。换句话说,子字符串需要附加到它们的引用字符串。有关此主题的更多信息 。
如果我有一个广义后缀树,我想插入一个长度为m
的新字符串,在O(m)
中是否可行?
(树的总长度为M >> m
)
是的。如果您还不熟悉它,我建议您阅读有关 Ukkonen's algorithm.
的内容现在假设你有一个广义后缀树(从现在开始表示为GST)包含N 字符串。然后,您想插入第 N+1 个字符串 S。我假设您已经为您的字符串定义了一个终端字符(例如 $
),并且您的输入字符串中永远不会遇到这个字符。
- 将
$
附加到 S (即从现在开始我们认为 S 被$
终止) - 使用 S 的内容沿着树向下走,直到:
- S的内容已用尽:这意味着字符串S已经插入到 之前
- 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 的技巧,因为 您有 多个 字符串来引用。换句话说,子字符串需要附加到它们的引用字符串。有关此主题的更多信息