Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Ukkonen算法构造的隐式后缀树的搜索_Algorithm_Suffix Tree - Fatal编程技术网

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

Algorithm Ukkonen算法构造的隐式后缀树的搜索,algorithm,suffix-tree,Algorithm,Suffix Tree,我遇到了一个问题,需要一个数据结构来保存字符串S,并允许我: 检查单词W在O(| W |)时间内是否是S的子单词 查找S的最长后缀,它也是给定单词U在O(| U |)时间内的前缀 在O(| K |)时间内将字符串K追加到S的末尾 我发现由Ukkonen算法构造的是我要搜索的。算法描述为,我对“在线”部分有一个问题:在插入每个字符后,算法构造一个隐式后缀树,可以在最后一步转换为显式后缀树。但如果我想在这一步之前使用隐式树进行搜索呢?“在线”表明,在插入分析字符串的任何前缀之后,这是可能的,但我找不

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

  • 检查单词W在O(| W |)时间内是否是S的子单词
  • 查找S的最长后缀,它也是给定单词U在O(| U |)时间内的前缀
  • 在O(| K |)时间内将字符串K追加到S的末尾
  • 我发现由Ukkonen算法构造的是我要搜索的。算法描述为,我对“在线”部分有一个问题:在插入每个字符后,算法构造一个隐式后缀树,可以在最后一步转换为显式后缀树。但如果我想在这一步之前使用隐式树进行搜索呢?“在线”表明,在插入分析字符串的任何前缀之后,这是可能的,但我找不到任何在隐式树上运行的最简单算法的例子

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


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

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

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

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

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

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