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

时间:2012-11-22 22:42:13

标签: algorithm suffix-tree

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

示例:

序列的后缀树

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

查询

25,25

结果

3

1 个答案:

答案 0 :(得分:1)

一种方法是:

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

  2. 构造后缀树。

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

  4. 如果这是不可能的,那么查询会出现0次。

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

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

    如果您希望执行多个查询,则可以使用深度优先搜索来计算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次计数。