KMP算法求next数组和nextval数组方法总结
KMP算法求next数组和nextval数组方法总结首先next数组,以下是天勤给出的求解步骤FL为从左边第一个字符起的字串FR为从右边第一个字符起的字串如果没理解可以看下面的例子例如模式串为123456...
KMP算法求next数组和nextval数组方法总结
首先next数组,以下是天勤给出的求解步骤

FL为从左边第一个字符起的字串
FR为从右边第一个字符起的字串

如果没理解可以看下面的例子
例如模式串为
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
|
a |
b |
a |
b |
a |
a |
a |
b |
a |
b |
a |
a |
首先next[1]为0
|
0 |
|
|
|
|
|
|
|
|
|
|
|
挡住2(就是用手挡住不堪后面的)及以后的所有字符,只有一个字符为a,则FL的长度为0,则next[2]为0+1=1
|
0 |
1 |
|
|
|
|
|
|
|
|
|
|
挡住3及以后的所有字符,只有a和b两个字符,FL和FR没有相同的字串,则长度为0则next[3]为0+1=1
|
0 |
1 |
1 |
|
|
|
|
|
|
|
|
|
挡住4及以后所有字符,FL=a,与FR=a,相等则FL和FR的长度为1,则next[4]为1+1=2
|
0 |
1 |
1 |
2 |
|
|
|
|
|
|
|
|
挡住5及以后所有字符,FL=ab,与FR=ab相等,则长度为2,则next[5]为2+1=3
|
0 |
1 |
1 |
2 |
3 |
|
|
|
|
|
|
|
挡住6及以后所有字符,FL=aba与FR=aba相等,则长度为3,则next[6]为3+1=4
|
0 |
1 |
1 |
2 |
3 |
4 |
|
|
|
|
|
|
挡住7及以后所有字符,FL=a与FR=a相等,则长度为1,则next[7]为1+1=2
|
0 |
1 |
1 |
2 |
3 |
4 |
2 |
|
|
|
|
|
以此类推
|
0 |
1 |
1 |
2 |
3 |
4 |
2 |
2 |
|
|
|
|
|
0 |
1 |
1 |
2 |
3 |
4 |
2 |
2 |
3 |
|
|
|
|
0 |
1 |
1 |
2 |
3 |
4 |
2 |
2 |
3 |
4 |
|
|
|
0 |
1 |
1 |
2 |
3 |
4 |
2 |
2 |
3 |
4 |
5 |
|
|
0 |
1 |
1 |
2 |
3 |
4 |
2 |
2 |
3 |
4 |
5 |
6 |
改进的K MP算法中求nexttval数组的方法

虽说天勤给的步骤看着挺简单的但是讲真我一开始没看懂,这啥玩意?????
还是用上面例子
想要求nextval需要先求出next数组的值
|
j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
|
模式串 |
a |
b |
a |
b |
a |
a |
a |
b |
a |
b |
a |
a |
|
next[j] |
0 |
1 |
1 |
2 |
3 |
4 |
2 |
2 |
3 |
4 |
5 |
6 |
首先j为1是nextval[1]赋值为0,特殊情况标记
|
nexttv a[j] |
0 |
|
|
|
|
|
|
|
|
|
|
|
j等于2时,对应模式串的值为b,对因的next[j]的值为1,则找到j=1的模式串即为a,b不等于a则nextval[2]的值即为next[2]的值即为1
|
nexttv a[j] |
0 |
1 |
|
|
|
|
|
|
|
|
|
|
j等于3时,对因的模式串的值为a,对因的next[j]的值为1,则找到j=1的模式串即为a,a等于a,则nextval[3]的值为nextval[next[3]]的值即为nextval[1]的值,即nextval[3]=0;
|
nexttv a[j] |
0 |
1 |
0 |
|
|
|
|
|
|
|
|
|
j等于4时,对因的模式串的值为b,对因的next[j]的值为2,则找到j=2的模式串即为b,b等于b,则nextval[4]的值为nextval[next[4]]的值即为nextval[2]的值,即nextval[4]=1;
以此类推,这里就不再赘述
|
nexttv a[j] |
0 |
1 |
0 |
1 |
0 |
4 |
2 |
1 |
0 |
1 |
0 |
4 |
更多推荐




所有评论(0)