KMP算法理解
2016-12-08 17:07
447 查看
KMP算法生成next数组理解
kmp算法的目的
首先说一下kmp算法的目的是为了优化传统字符串匹配的方法,由于传统的字符串匹配算法在出现不匹配后需要回退i和k即匹配字符串和模式字符串的当前下标,此方法做了许多无用功,故三位计算机学者 D.E.Knuth 与 V.R.Pratt 和 J.H.Morris提出了优化传统字符串匹配算法的方法:kmp。next数组生成理解
算法主要搞懂next数组的构造也就没问题了,在阅读完以下两篇博客后大概理解了kmp的思想但是依然存在两个主要问题:首先阅读下面博客,理解前后缀及大概思想
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html http://www.2cto.com/kf/201604/497086.html
此时依然有疑问在next数组构造中出现不匹配为什么选择:
k=next[k-1]
怎么保证next[k-1]之前的串与最后部分的串相同
阅读以下博客了解kmp理论及代码
http://www.tuicool.com/articles/e2Qbyyf
就是当当前的长度k不能用时必须使用更下的长度来匹配,以下是个人对构造next数组时出现不匹配时的处理理解以及为什么这么处理:
即是:while (k > 0 && pattern[q] != pattern[k]) k = next[k-1];这段代码的理解,其中k为当前前后缀长度,q为遍历pattern数组的下标
pattern | a | b | a | b | c | a | b | a | b | d |
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
next | 0 | 0 | 1 | 2 | 0 | 1 | 2 | 3 | 4 | 0 |
m=pattern.length,当(k=2,q=4)或者(k=4,q=9)都满足while (k > 0 && pattern[q] != pattern[k]),以下为理解为何满足此时不匹配条件的处理为k = next[k-1]:
Pattern[k]=c
Pattern[q]=d
此时Pattern[k]!= Pattern[q],5的长度不行说明要减小这个值,此时pattern[0]--pattern[k-1]=pattern[q-k]--pattern[q-1],此时就需要去这两个部分的内部找是否有最长前后缀存在,如果没有则要从头开始
故看next[k-1]=2说明:
pattern[0]-- pattern[next[k-1]-1]= pattern[next[k-1]]--pattern[k-1]
且(pattern[0]--pattern[next[k-1]-1])+( pattern[next[k-1]]--pattern[k-1])= pattern[0]--pattern[k-1]
且pattern[0]--pattern[k-1]=pattern[q-k]--pattern[q-1]
==>pattern[q-next[k-1]]--pattern[q-1]=pattern[next[k-1]]-- pattern[k-1]
==> pattern[q-next[k-1]]--pattern[q-1]=pattern[0]-- pattern[next[k-1]-1]
==>k= next[k-1]继续进行比较
kmp的代码在资源里有
有写的或理解的不正确的地方还请大家斧正
相关文章推荐
- [egret学习笔记01]显示对象的种类
- LeetCode maximum subarray
- RabbitMQ入门教程——工作队列
- appium新版本不支持findElementByName,切换到findElementByAndroidUIAutomator
- 理解Android多线程里面三种任务Runnable和Callable和FutureTask的用法
- 安装yum
- 网络 运输层(Transport)
- morphia将数据存入mongodb数据库,报错:···morphia.mapping. ···No usable constructor for com.XX.XX.XX
- unity sqlite数据库操作
- 关于html5新标签video在老ie上的兼容性
- Android播放音频之按钮控制
- 回调函数的作用机制
- 第二章 概率图模型的基本原理
- Python读写csv
- oracle打补丁
- Spring Boot 多数据源
- Async和Await如何简化异步编程,几个实例让你彻底明白!
- java设计模式之简单工厂模式
- web.xml配置五个有用的过滤器
- 新人掌握的五大Linux终端命令的技巧