KMP算法中计算next值和nextval的值

引言:

     书上关于next和nextval的修正值方法比较难理解,所以我这里讲解自己的方法。这里我就不介绍关于字符串匹配中KMP的优点,也不强调next的修正值比next的值好在哪,我们就说方法就行了。

一、next求解。

来,首先给我们一个序列

j12345678
模式串abaabcac
next[j]01122312

首先我给出一个大的方法,然后按照这个方法一一展示求解的过程。

【方法】:

   默认第一个和第二个字符的next值为0、1。那么从第三个开始依次执行如下操作:

    找到当前要求next字符的前一个,以它为标准,找到其next对应下标的字符,和这个字符做比较。若相等,那么当前字符的next值就位此字符next加一;若不等,继续找现在字符next所指的下一个字符,还是和之前的字符比较,直到找到第一个位置为止,那么next为1。

好,我们来看看上面的操作步骤

  1. a,bnext值为0,1
  2. 要求next[3],那么我看3的前面的字符b,b的next值指的下标为第一位,第一位字符和b不相等,而且已经指到了最后一位,那么next[3]的值就1.
  3. 要求next[4],那么看前一个字符a,a的next所指的下标为第一位,第一位的字符和a相等,那么当前next[4]值就为next[3]+1=2
  4. 要求next[5],那么看前一个字符a,a的next所指的下标为第二位,第二位的字符和a不相等,那么我们看第二位next所指的字符是第一位,第一位的字符与a相等,所以next[5]=next[2]+1=2
  5. 依次类推即可。

 

 

二、求nextval(即next的修正值)

j2345
模式串aaaab
next[j]01234
nextval[j]000

4

 

【方法】:

    在求出next的值的基础上,求nextval的方法其实很简单。默认第一个nextval的值是0,第二个字符如果和第一个字符相等,那么它的nextval的值就为0,不等就为1。之后遵循如下方法:

    找到当前要求nectval值的字符,看它的next值下标所指向的字符是否和它相等,相等那么nextval为当前所指下标的nextval值,不相等nextval的值就为本身字符的next值。

求上述的步骤:

  1. 第一个nextval值默认是0,第二个和第一个相等,所以也是nextval值也是0
  2. 第三个字符next所指的字符是2号位置的a,和它相等,那么nextva[3]的值就位nextval[2]得值,即为0
  3. 第四个字符next所指的字符是三号位置的a,和它相等,所以nextval的值就为3号位置的nextval值,即为0
  4. 第五个字符的next所指的字符是四号位置的a,和它不相等,那么nextval的值就是它自己的next的值,即为4
  5. 依次类推即可

 

【总结】

    当然,这些求next和next修正值的方法并不是唯一的,只是我自己在手写的时候觉得这个方法快捷简单。在程序中那又是另一回事了,这个可以看我的博客。如果有误,或者有问题,评论,谢谢。

 

 

 

 

  • 49
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

threecat.up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值