当前位置:文档之家› KMP算法中next算法执行过程

KMP算法中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
第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
位序 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[] ) {
j
i
4 5 6 7 8 9
第7轮执行 完毕结果:
位序 T串
1
2
3
a
0
b
1
a
1
a
2
b
2c3Fra bibliotekab
c
Next值
例题:求T串abaabcabcnext函数值的递推过程:
原函数: void get_next(SString &T, int &next[] ) {
// 求模式串T的next函数值并 存入数组next
第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
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
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
这实际上也是一个匹配的过程。 不同在于:主串和模式串是同一个串。
例题:求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
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
第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
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
第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
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轮执行 完毕结果:
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
第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
位序 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[] ) {
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
相关主题