KMP算法 next与nextval的求解

本文深入讲解了由Knuth,Morris,Pratt提出的KMP算法,该算法是一种高效的字符串匹配算法,通过使用next和nextval数组来避免重复比较,实现了线性时间复杂度的模式匹配。文中详细解释了next和nextval数组的计算方法,并提供了具体的函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
模式串abaabcac
next01122312
nextval
0102130
2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值