我已经实现了一种算法来构造后缀树。 现在,我正在尝试实现一个方法计数,该计数返回查询作为引用序列的子列表/子区间发生的次数。 最好的方法是什么?
示例:
序列的后缀树
1,2,50,100,25,25,25,50,100,25,25
查询
25,25
结果
3
答案 0 :(得分:1)
一种方法是:
在列表中添加唯一的终止符号(例如-1)。
构造后缀树。
现在根据查询中的数字向下走后缀树。
如果这是不可能的,那么查询会出现0次。
否则,根据当前位置计算子树中的叶节点。
查询在字符串中出现的次数等于子树中叶子节点的数量。
如果您希望执行多个查询,则可以使用深度优先搜索来计算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次计数。