KMP预处理功能

时间:2013-08-05 18:20:26

标签: preprocessor string-matching prefix knuth-morris-pratt

这是我在ItoA中看到的伪代码:

1 m = P.length
2 let pi[1...m] be a new array
3 pi[1] = 0
4 k=0
5 for q=2 to m
6    while k > 0 and P[k+1] != P[q]
7       k = pi[k]    
8    if P[k+1] == P[q]
9       k = k+1    
10   pi[q] = k
11 return pi

我怀疑为什么在第6行我们k = pi[k]而不是k--在我看来应该是检查长度为k的前缀的方式(因为如果{{1}它意味着长度P[k+1] != P[q]的前缀(也是后缀无法实现)也可以是后缀,即与k+1比较,我也认为如果我们这样做,运行时间将会保持不变。

1 个答案:

答案 0 :(得分:0)

递归调用k = pi[k]搜索p[1..q]的较小边框;因为pi[k]P[0..k]的最大边界,p[1..q]的边界小于pi[q]。它将搜索,直到找到p[1..q]的边框,其中下一个字符p[k+1]不等于P[q+1]

您可以在此处找到更多详细信息:http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/kmpen.htm