现在KMP算法我们基本完成了,对于next[i]函数还有提升的空间,比如字符串"abababaac"中
next[2]=0,字符s[2]="a"失配后应该和s[0]比较,但是s[0]也是"a",所以必定失配,那么这种
情况可以直接跳过进行下一次匹配,比较极端的情况,字符串"aaaaaab",当字符s[5]="a"失配
的时候,按next[i]算法,s[5]还要和s[4],s[3],s[2],s[1],s[0]进行比较,但是这些字符全是a,
因此肯定都失配,可以直接进行next[0]的匹配,减少不必要的比较次数,因此当s[i]==s[next[i]]时,
可以更新next[i]=next[next[i]],我们只需稍微更改下(2)中计算next[i]的代码:
nnext[0] = -1;
nnext[1] = 0;
if (t[0] == t[1])
nnext[1] = -1;
i=1, j=0;
while (i<tlen){
if (j == -1 || t[i] == t[j]){
++i;
++j;
if (t[i] != t[j] )
nnext[i] = j;
else
nnext[i] =nnext[j];
}
else
j = nnext[j];
}
改进的字符串t="aaaaaab"的nnext值如下表:
|
|
a |
a |
a |
a |
a |
a |
b |
|
i |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
|
next[i] |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
|
nnext[i] |
-1 |
-1 |
-1 |
-1 |
-1 |
-1 |
5 |
改进的字符串t="abababaac"的nnext值如下表:
|
|
a |
b |
a |
b |
a |
b |
a |
a |
c |
|
i |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
next[i] |
-1 |
0 |
0 |
1 |
2 |
3 |
4 |
5 |
1 |
|
nnext[i] |
-1 |
0 |
-1 |
0 |
-1 |
0 |
-1 |
5 |
1 |
本文深入探讨了KMP算法中next[i]函数的优化,通过实例展示如何减少字符串匹配过程中的无效字符比较,特别针对特定字符序列,如全相同字符或重复模式,提出了一种改进策略,显著提高了算法效率。
957

被折叠的 条评论
为什么被折叠?



