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 |