容易理解的KMP算法next数组求法详解

本文详细介绍了KMP算法中的next数组求解方法,包括next数组的意义、手动计算next值、求解next的算法过程,以及如何通过递推方式高效求得next数组。适合对KMP算法理解不深的读者,特别是对next数组求法感到困惑的人。
摘要由CSDN通过智能技术生成

如果你知道KMP算法的思想但还是自己写不出来,我猜你大概是不太明白next数组的求法。
网上很多关于KMP算法的博客写的都及其抽象和模棱两可。
我的上一篇博客 小白也能看懂的KMP算法 就是结合网上讲解的较为详细的博客,和学校老师的讲解,用自己的理解整合写出的。在里面开篇我就用大白话把KM这种算法令人砰然心动的地方讲解出来。
对于学什么东西,知道它好在哪,它的灵感来自于哪,适用于什么场景,很重要。就像有很多人刚开始学反射的时候,代码和原理是学了,但是就比如好好的修改属性,为啥要用反射而不是直接修改呢?这就是对于上面那三个问题没有想明白而造成的。
废话不多说,上一篇小白也能看懂的 KMP算法重点是思想的讲解和上面的三个问题(它好在哪,它的灵感来自于哪,适用于什么场景) 的解答。
这篇是关于KMP算法里面的重中之重 next数组的求法的解答。
正文开始:
注意:由于有的语言喜欢在字符串第一位存长度 所以 个别语言中字符串内容是从下标1开始的
用内容从下标1开始的字符串 来举例的好处就是 下标和顺序一一对应 下标1就是第一个
当然,即使不是用第一位存储长度的语言,也可故意舍弃第一位不用 从下标1开始 这样好对应也方便理解

第一个的是偏数学的理论证明,如果看不明白,直接看第二个更为白话的next原理解读。


假设KMP算法中的模式串为P,主串为S,那么该算法中的核心是计算出模式串的P的next函数。

KMP算法是在已知的模式串的next函数值的基础上进行匹配的。

由于本次只讨论next的求值过程,因此KMP算法的数学推理过程这里不再讲解。

从KMP算法的数学推理可知,此next函数只取决与模式匹配串自身的特点和主串没有任何关系,此函数

默认认为next[1]=0,由于next[j]=k表示的意义是当模式串和主串的第j个字符不匹配时,那么接下来和主串的第j个

字符匹配的字符是模式串的第k个字符。因此,next[1]=0表示当主串的当前字符和模式串的第1个字符不匹配,接

下来需要用模式串的第0个字符和主串的当前字符匹配,由于模式串下标是从1开始的,所以不可能存在第0个字符,

即接下的匹配动作是主串和模式串同时向右移动一位,继续模式匹配。
在这里插入图片描述此时,主串和模式串不匹配,而next[1]=0,因此,模式串的第0个字符和主串的第2个字符比较,而模式串没有第0个

字符,此时可以把第0个字符理解为空字符,即模式串向右移动一位,主串再继续喝模式串匹配,而此时的主串的当

前字符是第3个字符,整体来看是当主串和模式串的第1个字符不匹配时,主串和模式串同时右移一位,然后继续匹配。

接下来讲解一般情况下的next函数值求解过程。

设next[j]=k,根据KMP算法的模式串的特点可知,‘p1p2…pk-1’=‘pj-k+1…pj-1’,其中k必须满足1<k<j,并且不可能存在k‘>k满足上面等式。那么能够根据next[j]=k计算出next[j+1]的值吗?显然是能够计算出来的。
下面讨论具体求解过程:

当知道next[j]=k的值,求next[j+1]的值时候有两种情况,一种是pk=pj,另一种情况是pk!=pj。

1.当pk=pj时,那么可以

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值