1

这是我在 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(因为如果P[k+1] != P[q]这意味着k+1无法实现也是后缀的长度前缀)也可以是后缀,那与 相比P[q],我也认为如果我们这样做,运行时间将保持不变。

4

1 回答 1

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

于 2018-06-05T08:21:18.483 回答