KMP算法的next/next值的特殊理解
在学习KMP算法时,对于next/next值的计算总是处于一种模糊理解的状态。后来我结合老师的做法和网络新闻总结了这一点。 ,以下是我个人的一些经验,比较简单易懂。我希望这可以帮助一些人。
KMP算法工作模式
KMP算法与BF算法的主要区别是BF算法每次匹配时模式串移动到下一个数字,并从模式中的第一个位置重新开始比较。细绳; KMP算法的思想是,如果域已经存在一部分,则在区域中找到这个中小域的两部分,即子串在的概念中,减少比较次数,提高算法效率。 的部分,具有约束 。 我们以字符串测试的第 7 题为例。以下数值按照考试规则计算,不同教材可能有所不同。 在计算之前,首先要知道函数下一个值是什么。 显然没有一个字段是相等的,所以next[2]的值为0。这也可以解释为什么t[1]的next值必须为0。事实上,t[1]之前只有一个数字t[0]。不可能有两个相同的子数组,因此 t[1] 的下一个值必须为 0。当 j=3 时,没有两个字段与前面的字段相同,因此不再详细说明给予。 所示,可以看到有两个与之前字段abca类似的字符串标记,所以该字段的长度为相同的。 ,那么下一个值为 1。 (相同字段标有红色字母2) 所示,可以看出ab与❀的字段长度相同。 ,下一个值为 2。 发现没有一个 您还记得上面提到的约束和吗? 。但重要的是,约束是什么? 我们再看一下,刚才的没有问题 上面的后缀的前缀字符串可以是什么呢?可以看到子子第一个位置 但是, 有两个等于
计算下一个和下一个值
注意:一定要看完整个流程,不要着急
事实上,当基础字符串的第 i 个属性与模式字符串属性不匹配时,有两种不同的情况:
1. 接下来,将基础字符串的第 i+1 个字符与模式串第 1 个字符匹配;
2. 下一次比较仍会将基础字符串的第 i 个字符与模式字符串的字符进行比较。
以下值的使用场景是:在KMP算法中,当基础字符串和模式字符串与属性进行比较时,有一个属性不匹配,则将其右移如下:模式字符串。 value + 1。 首先,next[0]的值固定为-1,next[1]的值固定为0(后面会解释)
![]()
从j = 2开始,检查前面的两个字段是否相等。当前前场为ab场,颜色为,背景为黄色(以下情况下前面的场标记为♺♿全背景)
![]()
当j=4时,如下图
![]()
继续往下,当j=5时,情况与j=4相同。
当j=6时,如下图
![]()
接下来,当j=7时,
![]()
![]()
前缀和后缀
这是 的后缀 和 的后缀
。 之前的元音称为 ;同样,之后的![]()
![]()
同样是的,后缀箭头中的最后一个数字应该是黄色区域中的最后一个数字,即黄色中的[x-]面积 1]
我们回到j=,对于7,知道了后缀和后缀的定义之后,现在你明白下面的原因[7]=0吗?
如果你明白了,恭喜你,你已经掌握了如何计算下一个值
看看模式字符串中的前缀和后缀箭头,下一个值是正确的。通过更多练习,您可以快速找到下一个值。下面是完整的图表,你可以看一下然后再练习。
![]()
下一个值解决方案
一旦知道如何求解下一个值,相比之下,求解下一个值就更简单了,只不过nextval[0]的值仍然是 -♿ ,以下值遵循以下规则:
如果不相等则相等,如果相等则等于
。这是什么意思?
以下是第7题的数值表
![]()
注:上表是正确的表。下例中表中j=7列的next和next值是不正确的。请看上图练习
我标记了以下所有数字的值,我们看一些例子:
当j=1
![]()
t[1]=b时,next[1]=0,那么根据[1]=0我们发现t[0]=a,a与b不同,则next [1]=next [1]=0 2,这个与 t[2]=c,next[2]=0,那么我们找到t[0]=如下[2]=0 a,a与c不同,则则[2]= next[2]=0' 3 t[3]=a, next[ 3] =0,我们看到 t[0]=a 为 next[3]=0,a 等于 a,则 nextval[3]=next[0 ]=- 1,这就是等于,即当>>后面的特征值相同时不同但相同,当j=2时,
![]()
![]()
接下来的后续值判断也遵循上述方法,你可以尝试一下。示例中表中j=7列的next和next值为false。请根据第一张图练习
使用上面这个方法可以轻松得到下一个值和下一个值。希望对大家对KMP算法的计算和理解有所帮助。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网