+2 投票
分类:学习问题 | 用户: 9 5 3 (3.4k 分)

1个回答

+1 投票
用户: 9 4 3 (2.5k 分)

在KMP算法中,next数组(有时也称为fail数组或π数组)用于在发生不匹配时决定模式串应该向右移动多少位。而nextval数组是next数组的一个改进版

首先,定义next数组:

对于模式串P[0..m-1],next[j]表示P[0..j-1]中最长相同前后缀的长度(不包括整个串自身)。如果这样的前后缀不存在,则next[j] = 0。

next数组的构建通常使用如下算法:

 def compute_next(P, M, next):  

 next[0] = -1  

 i = 0  

 j = -1  

 while i < M - 1:  

 if j == -1 or P[i] == P[j]:  

 i += 1  

 j += 1  

 next[i] = j  

 else:  

 j = next[j] 

定义nextval数组:

nextval[j]与next[j]的主要区别在于,当P[j]等于P[next[j]]时,nextval[j]会取next[next[j]]的值,而不是直接取next[j]的值。这是因为在模式串的匹配过程中,如果当前字符相等但下一个字符不相等,那么我们可以跳过更长的前后缀,直接比较下一个字符。

nextval数组的构建通常使用如下算法:

def compute_nextval(P, M, next, nextval):  

 for i in range(M):  

 nextval[i] = next[i]  

 i = 0  

 while i < M - 1:  

 if nextval[i] == -1:  

 i += 1  

 elif P[i] == P[nextval[i]]:  

 nextval[i] = nextval[nextval[i]]  

 i += 1  

 else:  

 i += 1 

可以查看相关书籍和博客进一步深入认识

欢迎来到 在线问答系统 ,有什么不懂的可以尽管在这里提问,你将会收到社区其他成员的回答。
...