Code前端首页关于Code前端联系我们

KMP算法的next/next值的特殊理解

terry 2年前 (2023-09-27) 阅读数 63 #数据结构与算法

在学习KMP算法时,对于next/next值的计算总是处于一种模糊理解的状态。后来我结合老师的做法和网络新闻总结了这一点。 ,以下是我个人的一些经验,比较简单易懂。我希望这可以帮助一些人。

KMP算法工作模式

KMP算法与BF算法的主要区别是BF算法每次匹配时模式串移动到下一个数字,并从模式中的第一个位置重新开始比较。细绳; KMP算法的思想是,如果域已经存在一部分,则在区域中找到这个中小域的两部分,即子串在的概念中,减少比较次数,提高算法效率。

但是, 有两个等于

的部分,具有约束

计算下一个和下一个值

我们以字符串测试的第 7 题为例。以下数值按照考试规则计算,不同教材可能有所不同。

注意:一定要看完整个流程,不要着急

在计算之前,首先要知道函数下一个值是什么。
事实上,当基础字符串的第 i 个属性与模式字符串属性不匹配时,有两种不同的情况:
1. 接下来,将基础字符串的第 i+1 个字符与模式串第 1 个字符匹配;
2. 下一次比较仍会将基础字符串的第 i 个字符与模式字符串的字符进行比较。
以下值的使用场景是:在KMP算法中,当基础字符串和模式字符串与属性进行比较时,有一个属性不匹配,则将其右移如下:模式字符串。 value + 1。

首先,next[0]的值固定为-1,next[1]的值固定为0(后面会解释)

KMP算法的next/nextval值的个人理解

从j = 2开始,检查前面的两个字段是否相等。当前前场为ab场,颜色为,背景为黄色(以下情况下前面的场标记为♺♿全背景)

KMP算法的next/nextval值的个人理解

显然没有一个字段是相等的,所以next[2]的值为0。这也可以解释为什么t[1]的next值必须为0。事实上,t[1]之前只有一个数字t[0]。不可能有两个相同的子数组,因此 t[1] 的下一个值必须为 0。当

j=3 时,没有两个字段与前面的字段相同,因此不再详细说明给予。

当j=4时,如下图

KMP算法的next/nextval值的个人理解

所示,可以看到有两个与之前字段abca类似的字符串标记,所以该字段的长度为相同的。 ,那么下一个值为 1。 (相同字段标有红色字母2

继续往下,当j=5时,情况与j=4相同。

当j=6时,如下图

KMP算法的next/nextval值的个人理解

所示,可以看出ab与❀的字段长度相同。 ,下一个值为 2

接下来,当j=7时,

KMP算法的next/nextval值的个人理解

发现没有一个

等于上一个箭头,所以相等字段的长度为0,下一个值0但是,有些朋友看到这里会说,如果只是想要和上一个字段相同的子串,ab字段也像j=6就符合标准。这里,为什么下一个值不是2?或者,如下图所示,为什么下一个值不是1

KMP算法的next/nextval值的个人理解

前缀和后缀

您还记得上面提到的约束吗?
这是 的后缀 的后缀
之前的元音称为 ;同样,
之后的

元音 x 元音

。但重要的是,约束是什么?

我们再看一下,刚才的没有问题

KMP算法的next/nextval值的个人理解

KMP算法的next/nextval值的个人理解

上面的后缀的前缀字符串可以是什么呢?可以看到子子第一个位置

如果 J 的值现在设置为 时间现在 x , 后缀 的最后一个数字是 t[x-1]♸。从图中理解,在的黄色背景区域中,前缀箭头的第一个一定是区域的第一个,即黄色区域中的 。 , t[0];
同样是的,后缀箭头中的最后一个数字应该是黄色区域中的最后一个数字,即黄色中的[x-]面积 1]

我们回到j=,对于7,知道了后缀和后缀的定义之后,现在你明白下面的原因[7]=0吗?

如果你明白了,恭喜你,你已经掌握了如何计算下一个值

看看模式字符串中的前缀和后缀箭头,下一个值是正确的。通过更多练习,您可以快速找到下一个值。下面是完整的图表,你可以看一下然后再练习。

KMP算法的next/nextval值的个人理解

下一个值解决方案

一旦知道如何求解下一个值,相比之下,求解下一个值就更简单了,只不过nextval[0]的值仍然是 -♿ ,以下值遵循以下规则

如果不相等则相等,如果相等则等于

。这是什么意思?

以下是第7题的数值表

KMP算法的next/nextval值的个人理解

注:上表是正确的表。下例中表中j=7列的next和next值是不正确的。请看上图练习

我标记了以下所有数字的值,我们看一些例子:

当j=1

KMP算法的next/nextval值的个人理解

t[1]=b时,next[1]=0,那么根据[1]=0我们发现t[0]=a,a与b不同,则next [1]=next [1]=0 2,这个

不同但相同,当j=2时,

KMP算法的next/nextval值的个人理解

t[2]=c,next[2]=0,那么我们找到t[0]=如下[2]=0 a,a与c不同,则则[2]= next[2]=0' 3

KMP算法的next/nextval值的个人理解

t[3]=a, next[ 3] =0,我们看到 t[0]=a 为 next[3]=0,a 等于 a,则 nextval[3]=next[0 ]=- 1,这就是等于,即当>>后面的特征值相同时

接下来的后续值判断也遵循上述方法,你可以尝试一下。示例中表中j=7列的next和next值为false。请根据第一张图练习

使用上面这个方法可以轻松得到下一个值和下一个值。希望对大家对KMP算法的计算和理解有所帮助。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门