KMP算法中next算法执行过程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1轮循环,i=1,j=0: void get_next(SString &T, int &next[] ) { i = 1; next[1] = 0; j = 0; while (1 < T[0]) { if (j = 0 || T[1] == T[0]) { i=i+1=2; j=j+1=1; next[2] = 1; } } } // get_next
如匹配过程中,当 S[i] <> T[j] 时, 得到结果S中i之前与T中j之前有若干元素匹配: S[i-j+1..i-1] == T[1..j-1] 若已知 T[1..k-1] == T[j-k+1..j-1] 即模式串T中j之前的元素存在前缀=后缀 则有 S[i-k+1..i-1] == T[1..k-1] 即串S中i之前的若干元素=前缀 前缀的最后一个元素为T(k-1) 所以可以得出发生S[i] <> T[j]不匹配时,i不移 动的情况下,j移动到k的位置进行下一轮比较。
i = 1; next[1] = 0; j = 0; while (i < T[0]) { if (j = 0 || T[i] == T[j]) {++i; ++j; next[i] = j; } else j = next[j]; } } // get_next
第6轮循环,i=4,j=1: void get_next(SString &T, int &next[] ) {
while (4 < T[0]) { if (j = 0 || T[4] == T[1]) { i=i+1=5; j=j+1=2; next[5] = 2; } } } // get_next
while (5 < T[0]) { if (j = 0 || T[5] == T[2]) { i=i+1=6; j=j+1=3; next[6] = 3; } } } // get_next
i = 1; next[1] = 0; j = 0; while (i < T[0]) { if (j = 0 || T[i] == T[j]) {++i; ++j; next[i] = j; } else j = next[j]; } } // get_next
第9轮循环,i=6,j=1: void get_next(SString &T, int &next[] ) {
while (6 < T[0]) { j!=0 || T[6]!=T[1], 不满足if,所以执行: else j = next[1]=0; } } // get_next
i = 1; next[1] = 0; j = 0; while (i < T[0]) { if (j = 0 || T[i] == T[j]) {++i; ++j; next[i] = j; } else j = next[j]; } } // get_next
第10轮循环,i=6,j=0: void get_next(SString &T, int &next[] ) {
while (6 < T[0]) { if (j = 0 || T[6] == T[0]) { i=i+1=7; j=j+1=1; next[7] = 1; } } } // get_next
next函数值的递推过程,分析如下:
已知:next[1] = 0; 假设:next[j] = k;又 T[j] = T[k] 则: next[j+1] = k+1 若: T[j] T[k] 则需按照前面方法往前回朔,检查 T[j] = T[ ?] 也就是如果当前元素序号为j+1,则next[j+1]值的得出 要查看它的前一个元素j的next值(为k), 并且根据T[j]和T[k]是否相等来界定。
i = 1; next[1] = 0; j = 0; while (i < T[0]) { if (j = 0 || T[i] == T[j]) {++i; ++j; next[i] = j; } else j = next[j]; } } // get_next
Baidu Nhomakorabea
j
i
2 3 4 5 6 7 8 9
第3轮执行 完毕结果:
KMP(D.E.Knuth, V.R.Pratt,J.H.Morris) 算法
int Index_KMP(SString S, SString T, int pos) { // 1≤pos≤StrLength(S) i = pos; j = 1; while (i <= S[0] && j <= T[0]) { if (j = 0 || S[i] == T[j]) { ++i; ++j; } // 继续比较后继字符 else j = next[j]; // 模式串向右移动 } if (j > T[0]) return i-T[0]; // 匹配成功 else return 0; } // Index_KMP
位序 T串
1
2
a
0
b
1
a
1
a
2
b
2
c
a
b
c
Next值
例题:求T串abaabcabcnext函数值的递推过程:
原函数: void get_next(SString &T, int &next[] ) {
// 求模式串T的next函数值并 存入数组next
第7轮循环,i=5,j=2: void get_next(SString &T, int &next[] ) {
位序 T串
1
a
0
b
1
a
1
a
b
c
a
b
c
Next值
例题:求T串abaabcabcnext函数值的递推过程:
原函数: void get_next(SString &T, int &next[] ) {
// 求模式串T的next函数值并 存入数组next
第4轮循环,i=3,j=1: void get_next(SString &T, int &next[] ) {
j
i
3 4 5 6 7 8 9
第4轮执行 完毕结果:
位序 T串
1
2
a
0
b
1
a
1
a
2
b
c
a
b
c
Next值
例题:求T串abaabcabcnext函数值的递推过程:
原函数: void get_next(SString &T, int &next[] ) {
// 求模式串T的next函数值并 存入数组next
第3轮循环,i=2,j=0: void get_next(SString &T, int &next[] ) {
while (2 < T[0]) { if (j = 0 || T[2] == T[0]) { i=i+1=3; j=j+1=1; next[3] = 1; } } } // get_next
while (3 < T[0]) { if (j = 0 || T[3] == T[1]) { i=i+1=4; j=j+1=2; next[4] = 2; } } } // get_next
i = 1; next[1] = 0; j = 0; while (i < T[0]) { if (j = 0 || T[i] == T[j]) {++i; ++j; next[i] = j; } else j = next[j]; } } // get_next
j
i
2 3 4 5 6 7 8 9
第1轮执行 完毕结果:
位序 T串
1
a
0
b
1
a
a
b
c
a
b
c
Next值
例题:求T串abaabcabcnext函数值的递推过程:
原函数: void get_next(SString &T, int &next[] ) {
// 求模式串T的next函数值并 存入数组next
第2轮循环,i=2,j=1: void get_next(SString &T, int &next[] ) {
while (2 < T[0]) { j!=0 || T[2]!=T[1], 不满足if,所以执行: else j = next[1]=0; } } // get_next
i = 1; next[1] = 0; j = 0; while (i < T[0]) { if (j = 0 || T[i] == T[j]) {++i; ++j; next[i] = j; } else j = next[j]; } } // get_next
i = 1; next[1] = 0; j = 0; while (i < T[0]) { if (j = 0 || T[i] == T[j]) {++i; ++j; next[i] = j; } else j = next[j]; } } // get_next
j
i
3 4 5 6 7 8 9
第6轮执行 完毕结果:
第5轮循环,i=4,j=2: void get_next(SString &T, int &next[] ) {
while (4 < T[0]) { j!=0 || T[4]!=T[2], 不满足if,所以执行: else j = next[2]=1; } } // get_next
i = 1; next[1] = 0; j = 0; while (i < T[0]) { if (j = 0 || T[i] == T[j]) {++i; ++j; next[i] = j; } else j = next[j]; } } // get_next
这实际上也是一个匹配的过程。 不同在于:主串和模式串是同一个串。
例题:求T串abaabcabcnext函数值的递推过程:
原函数: void get_next(SString &T, int &next[] ) {
// 求模式串T的next函数值并 存入数组next
i = 1; next[1] = 0; j = 0; while (i < T[0]) { if (j = 0 || T[i] == T[j]) {++i; ++j; next[i] = j; } else j = next[j]; } } // get_next
j
i
2 3 4 5 6 7 8 9
第8轮执行 完毕结果:
位序 T串
1
a
0
b
1
a
1
a
2
b
2
c
3
a
b
c
Next值
例题:求T串abaabcabcnext函数值的递推过程:
原函数: void get_next(SString &T, int &next[] ) {
// 求模式串T的next函数值并 存入数组next
j
i
1 2 3 4 5 6 7 8 9
第2轮执行 完毕结果:
位序 T串
a
0
b
1
a
a
b
c
a
b
c
Next值
例题:求T串abaabcabcnext函数值的递推过程:
原函数: void get_next(SString &T, int &next[] ) {
// 求模式串T的next函数值并 存入数组next
第8轮循环,i=6,j=3: void get_next(SString &T, int &next[] ) {
while (6 < T[0]) { j!=0 || T[6]!=T[3], 不满足if,所以执行: else j = next[3]=1; } } // get_next
i = 1; next[1] = 0; j = 0; while (i < T[0]) { if (j = 0 || T[i] == T[j]) {++i; ++j; next[i] = j; } else j = next[j]; } } // get_next
j
i
4 5 6 7 8 9
第7轮执行 完毕结果:
位序 T串
1
2
3
a
0
b
1
a
1
a
2
b
2
c
3
a
b
c
Next值
例题:求T串abaabcabcnext函数值的递推过程:
原函数: void get_next(SString &T, int &next[] ) {
// 求模式串T的next函数值并 存入数组next
j
i
1 2 3 4 5 6 7 8 9
第9轮执行 完毕结果:
位序 T串
a
0
b
1
a
1
a
2
b
2
c
3
a
b
c
Next值
例题:求T串abaabcabcnext函数值的递推过程:
原函数: void get_next(SString &T, int &next[] ) {
// 求模式串T的next函数值并 存入数组next
j
i
2 3 4 5 6 7 8 9
第5轮执行 完毕结果:
位序 T串
1
a
0
b
1
a
1
a
2
b
c
a
b
c
Next值
例题:求T串abaabcabcnext函数值的递推过程:
原函数: void get_next(SString &T, int &next[] ) {
// 求模式串T的next函数值并 存入数组next