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

引言:

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

一、next求解。

来,首先给我们一个序列

j 1 2 3 4 5 6 7 8
模式串 a b a a b c a c
next[j] 0 1 1 2 2 3 1 2

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

【方法】:

   默认第一个和第二个字符的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的修正值)

j 2 3 4 5
模式串 a a a a b
next[j] 0 1 2 3 4
nextval[j] 0 0 0

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修正值的方法并不是唯一的,只是我自己在手写的时候觉得这个方法快捷简单。在程序中那又是另一回事了,这个可以看我的博客。如果有误,或者有问题,评论,谢谢。

发布了93 篇原创文章 · 获赞 193 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43919400/article/details/103736457