KMP算法中next数组及改进的kmp算法nextval数组的手工计算方法

10 篇文章 0 订阅
7 篇文章 1 订阅

PM算法和next数组的关系
ababaaababaa
PM算法得到的数组[0.0.1.2.3.1.1.2.3.4.5.6]
PM算法整体右移一位得到next数组[-1.0.0.1.2.3.1.1.2.3.4.5]
也可以将[-1.0.0.1.2.3.1.1.2.3.4.5]进行整体+1得到数组[0.1.1.2.3.4.2.2.3.4.5.6]这两个数组表示同一个只是写法不同不要混了.

一、求解next(总结:同加1,不同即1)

步骤:next数组值的程序设计求解方法:首先可以肯定的是第一位的next值为0,第二位的next值为1,后面求解每一位的next值时,根据前一位 进行比较。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到 第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。

举例

编号—:1 2 3 4 5 6 7 8
模式串 a b a a b c a c
next值 0 1 1 2 2 3 1 2

1.前两位必为0,1。

2.计算第三位的时候,看第二位b的next值,为1,则把b和1对应的a进行比较,不同,则第三位a的next的值为1,因为一直比到最前一位,都没有发生比较相同的现象。

3.计算第四位的时候,看第三位a的next值,为1,则把a和1对应的a进行比较,相同,则第四位a的next的值为第三位a的next值加上1,为2。因为是在第三位实现了其next值对应
的值与第三位的值相同。

4.计算第五位的时候,看第四位a的next值,为2,则把a和2对应的b进行比较,不同,则再将b对应的next值1对应的a与第四位的a进行比较,相同,则第五位的next值为第二位b的next值加上1,为2。因为是在第二位实现了其next值对应的值与第四位的值相同。

5.计算第六位的时候,看第五位b的next值,为2,则把b和2对应的b进行比较,相同,则第六位c的next值为第五位b的next值加上1,为3,因为是在第五位实现了其next值对应的值与第五位相

6.计算第七位的时候,看第六位c的next值,为3,则把c和3对应的a进行比较,不同,则再把第3位a的next值1对应的a与第六位c比较,仍然不同,则第七位的next值为1。

7.计算第八位的时候,看第七位a的next值,为1,则把a和1对应的a进行比较,相同,则第八位c的next值为第七位a的next值加上1,为2,因为是在第七位和实现了其next值对应的值与第七位相同。

总结: next 比较的是前一个的值, next加一在谁的基础上在第几位实现了其next值对应的值与目标位的前一个的值相同
相同加一. 不相同则寻找相同如果到最后没有相同则值为1

二、求解nextval(总结:同为0,不同为1)

求nextval数组值有两种方法,一种是不依赖next数组值直接用观察法求得,一种方法是根据next数组值进行推理,两种方法均可使用,视更喜欢哪种方法而定。

本文主要分析nextval数组值的第二种方法:
编号-------:1 2 3 4 5 6 7 8
模式串-----a b a a b c a c
next值 -----0 1 1 2 2 3 1 2
nextval值 -0 1 0 2 1 3 0 2

1.第一位的nextval值必定为0,第二位如果于第一位相同则为0,如果不同则为1。

2.第三位的next值为1,那么将第三位和第一位进行比较,均为a,相同,则,第三位的nextval值为0

3.第四位的next值为2,那么将第四位和第二位进行比较,不同,则第四位的nextval值为其next值,为2。

4.第五位的next值为2,那么将第五位和第二位进行比较,相同,第二位的next值为1,则继续将第二位与第一位进行比较,不同,则第五 位的nextval值为第二位的next值,为1

5.第六位的next值为3,那么将第六位和第三位进行比较,不同,则第六位的nextval值为其next值,为3。

6.第七位的next值为1,那么将第七位和第一位进行比较,相同,则第七位的nextval值为0。

7.第八位的next值为2,那么将第八位和第二位进行比较,不同,则第八位的nextval值为其next值,为2。

总结:不相同则为其对应的next值,相同则继续查找直到不相同nextval值为在第几位实现了其next值对应的值与目标位的值相同如果到最后还是相同(没有不相同的)则值为0

原文链接:KMP算法中next数组及改进的kmp算法nextval数组的手工计算方法

看到最后的帮忙点个👍🙏 谢谢,这个对我真的很重要!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值