KMP算法 next与nextval的求解

来源:互联网 发布:靠网络赚钱 编辑:程序博客网 时间:2024/05/22 12:04

KMP算法是由Knuth,Morris,Pratt共同提出的模式匹配算法,对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法。KMP算法对于朴素匹配算法的改进是引入了一个跳转表next[]。

next的求解:第一位的next值为0,第二位的next值为1。模式中第j个字符之前前后相等的最大真子串长度加1。

函数实现:

void get_next(SString T,int next[])
{//求模式串T的next函数值并存入数组next
    i=1;next[1]=0;j=0;
    while(i<T.length)
    {
        if(j==0||T.ch[i]==T.ch[j])
        {
            ++i;++j;next[i]=j;
        }
        else j=next[j];
    }
}

nextval的求解:第一位的nextval值为0,第二位如果与第一位相同则为0,不同则为1。

第j位与next[j]位进行比较,不同则为next[j];相同则与第next[j]位next值相同。

函数实现:

void get_nextval(SString T,int nextval[])
{//求模式串T的next修正函数值并存入数组nextval
    i=1;nextval[1]=0;j=0;
    while(i<T.length)
    {
        if(j==0||T.ch[i]==T.ch[j])
        {
            ++i;++j;
            if(T.ch[i]!=T.ch[j])    nextval[i]=j;
            else nextval[i]=nextval[j];
        }
        else j=nextval[j];
    }
}

样例:

j12345678模式串abaabcacnext01122312

nextval
0102130
2