博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KMP算法中next数组及改进的kmp算法nextval数组的手工计算方法
阅读量:3948 次
发布时间:2019-05-24

本文共 2008 字,大约阅读时间需要 6 分钟。

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

原文链接:

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

转载地址:http://uqqwi.baihongyu.com/

你可能感兴趣的文章
递归:访问页面的控件或文件夹的下文件
查看>>
DataGridView分頁控件
查看>>
Linq 使用entity framework查询视图返回重复记录的问题(转)
查看>>
项目中得到执行文件版本或其它信息
查看>>
WinForm DatagridView绑定大量数据卡顿的问题
查看>>
DataGridView或 DataTable导出到excel
查看>>
Ilist To DataTable
查看>>
SQL @@IDENTITY, IDENT_CURRENT,SCOPE_IDENTITY
查看>>
簡單工廠模式
查看>>
SQL Server的數據類型
查看>>
php的正则表达式 '/\b\w…
查看>>
ThinkPHP的标签制作及标签调用解析…
查看>>
thrift的lua实现
查看>>
编写高性能的Lua代码
查看>>
Python正则表达式指南
查看>>
LUA--thrift--lib库的创建生成
查看>>
Shell开启扩展模式匹配shopt -s extglob
查看>>
浅谈 URI 及其转义
查看>>
nginx 优化
查看>>
openresty+lua在反向代理服务中的玩法
查看>>