KMP算法

KMP算法学习

转载注明出处http://blog.csdn.net/qq_24424175/article/details/52441646
字符串匹配是计算机的基本任务之一。
说起字符串匹配,那就不得不说Knuth-Morris-Pratt算法(简称KMP),对于KMP算法,一开始也是摸不清头绪,最终还是看明白了,分享下,智商不够,如果有错,欢迎指正交流。

这里分享一篇对KMP理解深入的博客Jake Boxerhttp://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/


下面说说我自己对KMP算法的理解
所谓字符串匹配算法,那么就不得不提朴素匹配算法,在传统的算法思想中,我们常常习惯对字符串进行一一匹配,把字符串a[i]与字符串b[j]进行对比,一个个字符串进行匹配
a[i]=abcabcacab与其它字符串进行匹配,没出现不匹配就向后进行匹配需要匹配16次
这里写图片描述
KMP算法对于朴素匹配算法引进了一个跳转表next[]下面先给出
KMP算法流程
假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置
如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++,继续匹配下一个字符;
如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]。此举意味着失配时, 模式 串P相对于文本串S向右移动了j - next [j] 位。
换言之,当匹配失败时,模式串向右移动的位数为:失配字符所在位置 - 失配字符对应的next 值,即移动的实际位数为:j - next[j],且此值大于等于1。
其中next[]数组便很好理解了,代表当前字符之前的字符串中,有多大长度的相同前缀后缀,如next [j] = k,代表j 之前的字符串中有最大长度为k 的相同前缀后缀。
此也意味着在某个字符失配时,该字符对应的next 值会告诉你下一步匹配中,模式串应该跳到哪个位置(跳到next [j] 的位置)。如果next [j] 等于0或-1,则跳到模式串的开头字符,若next [j] = k 且 k > 0,代表下次匹配跳到j 之前的某个字符,而不是跳到开头,且具体跳过了k 个字符

采用KMP算法只需要匹配6次就可以完成
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值