如果我有一个通用后缀树,并且我想插入一个长度为<!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)
)
答案 0 :(得分:2)
是的。如果你还不熟悉它,我建议你阅读Ukkonen's algorithm。
现在假设您有一个广义后缀树(从现在开始用 GST 表示),其中包含 N 字符串。然后,您要插入 N + 1 -th字符串 S 。我假设你已经为你的字符串定义了一个终结符(例如$
),并且你的输入字符串中永远不会遇到这个字符。
$
附加到 S (即从现在起我们认为 S 被$
终止)第一步将引导您到需要编辑树的起点。它显然是线性的:当 S 的 k 字符出现不匹配时, O(k)。
我们假设之前没有插入 S 。不匹配可以以下列方式之一发生:
这必须提醒你后缀树的迭代构造,这正是它:我们只需指出起点并恢复树构造(将处理这种二分法)。
所以你只需要继续为 S 构建树,就好像 GST 是一个常见的后缀树 < SUP>(1) 即可。这种结构是 O(m-k),因此总复杂度为 O(m-k + k)= O(m)
(1):实际上,它比这复杂一点。在Ukkonen的算法中,由后缀树表示的字符串 S 的子字符串基本上是一对索引(开始,结束),表示所述子串的第一个和最后一个字符。当你考虑 GST 时,你需要一些额外的机制来保持Ukkonen的技巧,因为你有多个字符串来引用。换句话说,子串需要附加到它们的引用字符串。有关此other SO question的主题的更多信息。