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

时间:2016-07-16 17:57:13

标签: data-structures suffix-tree

如果我有一个通用后缀树,并且我想插入一个长度为<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Site Title</title> <link rel="stylesheet" href="css/foundation.min.css"> <link rel="stylesheet" href="css/app.css"> <script type="text/javascript" src="js/jquery.min.js"></script> <script type="text/javascript" src="js/foundation.min.js"></script> </head> <body> <!-- Page Content --> <footer> <script type="text/javascript"> $(document).foundation(); </script> </footer> </body> </html> 的新字符串,那么m是否可以?

(树中的总长度为O(m)

1 个答案:

答案 0 :(得分:2)

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

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

  1. $附加到 S (即从现在起我们认为 S $终止)
  2. 使用 S 的内容向下走树,直到:
    1. S 的内容已用尽:这意味着字符串 S 已经插入
    2. 之前
    3. S 中的字符与树的内容不匹配
  3. 第一步将引导您到需要编辑树的起点。它显然是线性的:当 S k 字符出现不匹配时, O(k)

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

    • 我们最终进入一个节点,无法找到以 S的第k个字符开头的转换。
    • 不匹配发生在转换过程中,即树中当前没有与新检测到的分支状态对应的节点。

    这必须提醒你后缀树的迭代构造,这正是它:我们只需指出起点并恢复树构造(将处理这种二分法)。

    所以你只需要继续为 S 构建树,就好像 GST 是一个常见的后缀树 < SUP>(1) 即可。这种结构是 O(m-k),因此总复杂度为 O(m-k + k)= O(m)

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