【问题标题】:Search in implicit suffix tree constructed by Ukkonen algorithm在 Ukkonen 算法构造的隐式后缀树中搜索
【发布时间】:2012-12-25 19:09:53
【问题描述】:

我遇到了一个问题,它需要一个包含字符串 S 的数据结构并允许我:

  1. 在 O(|W|) 时间内检查单词 W 是否是 S 的子词
  2. 在 O(|U|) 时间内找到 S 的最长后缀,它也是给定单词 U 的前缀
  3. 在 O(|K|) 时间内将字符串 K 追加到 S 的末尾

我发现由 Ukkonen 算法构造的suffix trees 是我正在寻找的。算法被描述为"On-line construction of suffix trees",我对“在线”部分有一个问题:插入每个字符后,算法构造一个隐式后缀树,可以在最后一步转换为显式。但是如果我想在这一步之前使用隐式树进行搜索呢? “在线”表明在插入分析字符串的任何前缀之后是可能的,但我找不到任何在隐式树上运行的最简单算法的示例。

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

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

【问题讨论】:

    标签: algorithm suffix-tree


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 2010-11-21
      • 2014-11-21
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多