kmp 算法总结
来源:互联网 发布:mac开机显示客人用户 编辑:程序博客网 时间:2024/05/23 12:33
肯定有很多人对kmp算法,学了很多遍了,还是不懂,其实,很简单,我们简单的来看两个问题,就可以了!
一般的暴力算法,大家,应该都知道,扫两次,直接比较,就可以得到答案了,
我们直接来看,有没有可以简化
首先,和一般的算法一样,直接匹配,直到p[i]!=p[j];这时,如果是一般的算法i要回退回去,j也要从新开始,但我们没有好好的利用已经得到的有用信息
如图已经知道了,前面一段是相等的,我们能不能想个办法,不让i移动,直接比较呢,这是有的,如果我们知道,j前面字符串的,最大前缀等于后缀,就是标记的A是相等的,
那么,就不用移动i了,直接比较p[i]==p[next[j]],就可以了!
这样,就引入了next数组,next数组,简单点,就是最大前缀等于后缀,就是要求出上图的最大的A的长度,就可以了!
那么如何求出A最大的长度呢,看这个图
如果p[i-1] == p[k],那么,我们就可以直接得到next[i]= next [i-1]+1;
如果,不相等,我们可以用递推求出,
如图,我们这是知道了,p[i-1] != p[k];但我们也同时知道了有用信息A0 A1 A2是相同的字符串!
这时,我们把k = next[k],那么,根据next 数组的定义,我们知道B0 B1 B2 B3 B4 B5都是相同的了,那么,我们只要比较p[i-1] == p[next[k]],就可以得出next[i-1]了,当然,如果还不相等,就再k = next [k],这样,就一定,找到最开始的点结束,就可以得到答案了!
我学kmp也是不懂为什么,所以老是忘,自从画了这两个图,就再也不用背代码了,可以自己写出来了,所以希望读者,明白这两个图,就自然明白了kmp算法!
- KMP (KMP+拓展KMP)算法总结
- KMP算法总结
- kmp算法总结
- KMP算法总结
- KMP算法总结
- KMP算法学习总结
- KMP算法大总结
- kmp算法总结
- KMP算法总结
- KMP算法总结
- KMP算法总结
- KMP算法学习&总结
- KMP算法学习&总结
- KMP算法总结
- kmp算法总结
- 拓展kmp算法总结
- KMP算法总结
- kmp 算法总结
- 【java】反射
- Poco logger 日志使用小析
- nyoj 7 街区最短路径问题
- Unity3D中写入SQL数据库抛出InvalidProgramException解决过程
- iOS-------------断点续传
- kmp 算法总结
- 【Javaweb】后台的字符串转义,入库之前记得先对字符串转义防止sql注入问题
- C++实现指定的字符串替代(华为)
- 天声人語 20150328
- Python的字典操作
- apache在添加了新的端口号后被提示没有权限绑定到这个端口
- rabbitmq
- 第3周项目2-分数类的雏形
- MVC Razor模板引擎 @RenderBody、@RenderPage、@RenderSection及Html.RenderPartial、Html.RenderAction