由KMP算法可以知道,next数组是用来标记在这个字符之前最多有多少个字符与字符串开头的字符相同,以便找到在字符串匹配的时候,如果不匹配了指针需要回退的位置。KMP算法用于模式匹配已经很高效了,但是在某些情况下也有不足,比如说在字符串aaabaaaab中匹配aaaab,我们由next数组可以知道,模式串aaaab的next数组依次为01234,因此目标串aaabaaaab与模式串aaaab在匹配的时候,目标串的第四个字符b与模式串的第四个字符a不匹配,因此指向模式串的指针j回退到next[j]=3,也为a,a与目标串的b不匹配,j再次回退到next[j]=2,还是a,也不匹配,再回退到next[j]=1,还是字符a,也不匹配,再回退到next[j]=0,这时已经回退到最开始了,但是一次一次的回退显得很麻烦,因此对next数组进行了改进,就是在求next数组的值的时候,判断一下,如果这个字符的next[j]=k,则next[j+1]不是直接等于k+1,而是判断一下,如果,j+1的字符等于k+1的字符,那么next[j+1]=next[k+1],因此字符串aaaab的nextval数组就是00004,用代码表示就是
void get_nextval(SString T, int &nextval[])
{
i= 1; nextval[1] = 0; j = 0;
while( i<T[0]){
if(j==0 || T[i] == T[j])
{
++i; ++j;
if(T[i] != T[j]) nextval[i] = j;
else nextval[i] = nextval[j];
}
else j = nextval[j];
}
}
当我们自己在求nextval数组时,可以按照以前求next数组的方法先把next数组求出来,在求nextval数组时需要判断一下,如果 这个字符的next所指的字符与这个字符相同,则这个字符的nextval就去取与它相等的前面的那个字符的nextval的值,否则,如果这个字符的next数组的值 所对应的字符与这个字符不相等,则这个字符的nextval就是这个字符的next的值。
KMP算法中next函数的改进
最新推荐文章于 2023-08-05 15:23:56 发布