在Ukkonen算法构造的隐式后缀树中搜索

Search in implicit suffix tree constructed by Ukkonen algorithm

我遇到了一个问题,需要一个数据结构来保存字符串并允许我:

  • 检查单词w是否是o(w)time中s的子字
  • 查找S的最长后缀,它也是O(U)时间中给定单词U的前缀
  • 在o(k)时间的s结尾附加字符串k
  • 我发现Ukkonen算法构造的后缀树就是我要搜索的。算法被描述为"后缀树的在线构造",我对"在线"部分有一个问题:在插入每个字符后,算法构造一个隐式后缀树,在最后一步可以转换为显式后缀树。但是如果我想在这一步之前使用隐式树进行搜索呢?"在线"表明在插入分析字符串的任何前缀之后都是可能的,但是我找不到任何在隐式树上操作的最简单算法的例子。

    我的问题是:如何在隐式后缀树中搜索字符串?

    编辑:我接受了一个很好的答案来解决我的问题,但同时我设法找到了一个更简单的解决方案2:使用kmp算法在长度为s的后缀中搜索u就足够了,最后匹配的字符数将是字符串重叠。


    隐式后缀树和显式后缀树只有一个区别:它不包含字符串结尾标记(并且不包含与这些字符串结尾标记对应的任何分支)。

    这意味着在隐式后缀树或显式后缀树中搜索子字符串没有区别。由于隐式后缀树包含较少的不必要分支,这就保证了子字符串搜索的效率更高(但仍然是线性时间)。

    所以需求1会自动满足:只需从根目录中搜索后缀树并选择与给定单词匹配的分支。

    至于需求2,我认为您不能用相同的隐式后缀树来满足它。因为您需要字符串结尾标记来处理后缀。

    但您可以在O(|U|)时间内对给定的单词U使用单独(显式)后缀树来完成。诀窍是在构造后缀树之前反转这个词。要查找S的最长后缀(也是U的前缀),请使用此单独的后缀树查找反转字符串S的最长前缀(也是反转字符串U的后缀)。只需从根目录中搜索这个后缀树,选择与反向字符串S匹配的分支,并记住带有字符串结束标记的最新节点。然后反转从根到该节点的路径上的字符串(或确定该路径的长度并从EDOCX1的尾部复制相同长度的子字符串)(2)。