一幅图让你彻底理解KMP算法
来源:互联网 发布:淘宝网男士休闲布鞋 编辑:程序博客网 时间:2024/06/17 18:49
本文转载自:怎么理解KMP算法next数组
图很清晰,看了懂了很多,对kmp的next数组理解很透彻。
KMP算法最难理解的莫过于next数组。为什么在p[j]!=p[k]时,需要将k赋值为next[k]?通过一副图分析了KMP算法中next数组的计算原理,指出next[k]表示的就是字符串长度为k的头部字符串的最长前缀和后缀,所以当p[j]!=p[k]时,应该将最长匹配长度k回退到next[k]的长度,然后开始新一轮的匹配过程!.
对于KMP算法,最难理解的莫过于next数组是如何计算得到的。看了这幅图,你还不了解为什么吗?
假设当前考虑的是下标为j的字符,此时已经有头部k长度的字符与尾部k长度的字符是相等的,即图中标的两个长度为k的子字符串(为什么?这难道不就是next数据的含义吗?)。
如下图,如果p[j]=p[k],万事大吉,说明头部字符和尾部字符的长度都可以增加1。 KMP最难理解的是,如果p[j] != p[k]时,为什么要将k赋值为next[k] ??? 重点来了,你看下图中的那个头部长度为k的子字符串,他其实也是经过了前缀、后缀匹配过程的呢! 所以,对于长度为k的头部子字符串,他可能有图中蓝色部分的前缀和后缀。
注意,如果图中头部的黄色表示的字符与下标j表示的字符相等,那么,下标j找到了他的最长前缀了。那头部黄色表示的字符的下标是多少????这就是关键!!头部黄色表示的字符的下标就是next[k]。 为什么?因为next[k]表示的就是字符串长度为k的头部字符串的最长前缀和后缀。这就是kmp算法中next数组的定义啊!
![kmp算法next数组](http://7xj852.com1.z0.glb.clouddn.com/blog/2015/07/22/kmp.jpg)
阅读全文
1 0
- 一幅图让你彻底理解KMP算法
- 教你从头到尾彻底理解KMP算法
- 教你从头到尾彻底理解KMP算法
- 教你从头到尾彻底理解KMP算法
- 教你从头到尾彻底理解KMP算法
- 教你从头到尾彻底理解KMP算法
- 彻底理解KMP算法
- 从头到尾彻底理解KMP算法
- 从头到尾彻底理解KMP算法
- 从头到尾彻底理解KMP算法
- 从头到尾彻底理解KMP算法
- 经典算法研究系列:六、教你从头到尾彻底理解KMP算法
- 字符串匹配的KMP算法彻底理解
- 从头到尾彻底理解KMP
- 从头到尾彻底理解KMP
- 从头到尾彻底理解KMP
- 从头到尾彻底理解KMP
- 从头到尾彻底理解KMP
- LoadRunner 技巧之 集合点设置
- 一个人才数据网的爬虫软件
- Java基础学习之发送邮件
- python学习记录
- 简单排序以及冒泡排序
- 一幅图让你彻底理解KMP算法
- printf Log打印封装
- Unity使用过程中遇到的问题
- Linux常见命令
- lucene--DocInverterPerField/DocInverterPerField
- 密码8到64位大小写字母+数字+字符 不能包含空格
- 高逼格关键词文摘--Peter
- Kotlin编程之Kotlin Android Extensions(扩展插件)
- erlang 17.1 centos6.5 安装