经过一天KMP的学习,总算有些眉目。
KMP就是对简单匹配的改进,通过建立Next数组记录串成员的位置来避免了一个指针的回溯来降低时间复杂度。
KMP的核心就是这个next数组,而next数组的实质是着实不好理解。
对于KMP,我理解的next数组是储存了,模式串当前位置前和模式串前多少个字符相同,可以指针前移而不用比较。
对于KMPVAL中的next,我的理解是与KMP类似,记录了的将要跳转的位置,但是next中特殊对待了相同的元素next[j] = next[k],使得在“失配”的情况下更大步后退。
因为在获得next数组过程中,其实是模式串本身的kmp,利用的是刚刚计算出来的next表。
因此,在获得next中可以有循环节之类的活用。
//KMP求NEXT函数
void kmpnext (char *T,int next[])
{
int j = 0,k = -1;
next[0] = -1;
while (T[j] != '\0')
{
if (k == -1 || T[j] == T[k])
{
j++;
k++;
next[j] = k;
}
else
k = next[k];
}
}
//KMPVAL求NEXT函数
void kmpnext (char *T,int next[])
{
int j = 0,k = -1;
next[0] = -1;
while (T[j] != '\0')
{
if (k == -1 || T[j] == T[k])
{
j++;
k++;
if (T[j] != T[k])
next[j] = k;
else
next[j] = next[k];
}
else
k = next[k];
}
}