algorithm - 是否有众所周知的算法来计算后缀树中的子串?

标签 algorithm suffix-tree

我已经实现了一种算法来构建后缀树。 现在,我正在尝试实现一个方法计数,它返回查询发生的次数作为引用序列的子列表/子间隔。 最好的方法是什么?

例子:

序列的后缀树

1,2,50,100,25,25,25,50,100,25,25 

查询

25,25

结果

3

最佳答案

一种方法是:

  1. 向列表添加一个唯一的终止符号(例如 -1)。

  2. 构造后缀树。

  3. 现在根据查询中的数字沿着后缀树向下走。

  4. 如果这不可能,则查询出现 0 次。

  5. 否则,根据您当前位置计算子树中的叶节点。

查询在字符串中出现的次数等于子树中叶节点的个数。

如果您想进行多个查询,那么您可以使用深度优先搜索来计算 O(n) 中叶节点的数量,并将答案存储在每个节点中。这将让您在时间 O(k) 内执行查询,其中 k 是查询字符串的长度。

这是可行的,因为您的后缀树将具有每个后缀的叶节点:

1,2,50,100,25,25,25,50,100,25,25
2,50,100,25,25,25,50,100,25,25
50,100,25,25,25,50,100,25,25
100,25,25,25,50,100,25,25
25,25,25,50,100,25,25
25,25,50,100,25,25
25,50,100,25,25
50,100,25,25
100,25,25
25,25
25

其中,按照25,25查询下树后,子树中剩余的叶子节点分别对应:

25,25,25,50,100,25,25
25,25,50,100,25,25
25,25

它给出了字符串中查询的 3 次计数。

关于algorithm - 是否有众所周知的算法来计算后缀树中的子串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13520935/

相关文章:

java - 为什么插入排序在不同的实现中在时间上运行如此不同

string - Ukkonen 后缀树 : procedure 'canonize' unclear

algorithm - 寻找最长的重复子串

c++ - 如何加快计算最长公共(public)子串的长度?

c++ - 如何检查 x-y 轴上的碰撞

arrays - 将零移动到数组编程练习末尾的性能

java - 我可以生成复杂度 < O(n^2) 的所有子字符串吗

algorithm - 从字符串 S[1..m] 的后缀树生成字符串 S[2..m] 的后缀树

按项目分配资源的算法(装箱?)

database - 部分堆排序以在 5GB 文件中找到 k 个最频繁出现的单词