美文网首页Java
KMP算法的一种解释

KMP算法的一种解释

作者: mocyx | 来源:发表于2020-01-11 20:29 被阅读0次

KMP算法很复杂,有很多解释方式(DFA,前缀后缀),下面是我的一种理解。

我们在s1中匹配s2,s1、s2的长度分别为N,M
1,首先我们按顺序匹配,直到匹配失败

i表示s1的匹配起始位置,j表示s2的匹配位置

image.png

2,如果使用暴力搜索算法下一步将是这样的:


image.png

这样算法的复杂度是N*M
但是我们可以利用已经匹配到的字符串(AABAA)进行优化:

image.png
3,由于AABAA是已知的与s1无关的信息,下一步我们可以做到匹配位置(红框)不变,i向前跳过一些字符,j变小,减少匹配长度
这种情况一共有以下几种:
image.png
可以看出来只有C、D、E是合法的(红框前面的部分必须匹配)
在CDE中我们只能选择C,因为选择D、E会跳过C这个可能的正确匹配
4,这里的C其实就是AABAA的最长前缀后缀匹配
它满足:
1,C是一个前缀后缀匹配:AABAA的长度为n前缀和长度为n的后缀相等
2,C是n最大的前缀后缀匹配
image.png
5,在j=5的时候,最长前缀后缀匹配的长度为2
接下来要做的事情就是:
i+=(j-2)=3
j=2

而i+j=5,所以当前匹配位置维持在红框处不变

6,所以只要我们计算出s2上面每个位置的最长前缀后缀匹配长度(前后缀匹配数组)就可以加速匹配过程了
更详细的分析可以看出KMP算法的匹配过程时间复杂度是O(N)的

下面介绍如何计算前后缀匹配数组preSuffixArr
1,首先preSuffixArr[0]=0, 这是因为前后缀匹配不能匹配自己
2,然后preSuffixArr[n]可以按照下面的规则递归计算
首先取v=preSuffixArr[n-1],代表前n-1个字符的最长前后缀匹配:
如果s2[v+1]==s2[n], 那么可以补上这个字符,构成一个长度为n+1的最长前后缀匹配
如果s2[v+1]!=s2[n], 继续对v=preSuffixArr[v-1]计算这个过程

下面示例介绍如何构造AACAABAAA的[前后缀匹配数组preSuffixArr]

k表示当前计算位置,
1,k=0,preSuffixArr[0]=0

image.png

2,k=1,然后由于s2[0]==s2[1]="A",preSuffixArr[1]=preSuffixArr[0]+1


image.png

3,k=2,v=preSuffixArr[1]=1, 由于s2[2]!=s2[1],匹配失败
然后v=preSuffixArr[v-1]=0, s2[2]!=s2[0], 匹配失败preSuffixArr[2]=0


image.png

...
9,k=8,v=preSuffixArr[7]=2,s2[2]!=s2[8],匹配失败


image.png

v=preSuffixArr[7]=2,s2[1]!==s2[8],匹配成功


image.png

可以证明计算前后缀匹配数组的过程时间复杂度是O(M)的,KMP算法整体时间复杂度是O(M+N)

相关文章

  • KMP算法——寻找子串位置

    KMP算法——寻找子串位置 1、KMP算法简介: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J....

  • 【扩展kmp】扩展kmp及i+next[i-a]分析

    【扩展KMP参考】: 扩展KMP算法-刘毅 上文对于扩展kmp的分析很详细,解释的很清晰。但在文中写的i+next...

  • KMP算法的一种解释

    KMP算法很复杂,有很多解释方式(DFA,前缀后缀),下面是我的一种理解。 我们在s1中匹配s2,s1、s2的长度...

  • 字符串匹配的KMP算法

    Mark一下阮一峰老师关于KMP算法的解释

  • leetcode字符串匹配算法之KMP算法

    本篇介绍一种高效的字符串匹配算法——KMP算法。 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J....

  • KMP 专题整理

    KMP 学习记录 kuangbin专题十六——KMP KMP 学习总结 朴素 KMP 算法 拓展 KMP 算法(E...

  • 算法 & 数据结构——KMP算法

    KMP算法,俗称看毛片算法,顾名思义,以下是算法介绍:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,...

  • 对KMP算法的一些理解

    最近学到KMP算法,下面讲讲对KMP算法的一些个人理解,希望对大家有帮助! 对于KMP算法的理解: 整个KMP算法...

  • 给小白讲解KMP算法

    >> KMP算法详解,小白都懂的讲解,欢迎交流,边听歌边看吧 概念解释 Knuth-Morris-Pratt算法,...

  • 字符串匹配 (KMP算法)

    说明 kmp的一些概述不做解释了, 请参考: kmp算法 (百度百科)参考了 阮一峰的: 字符串匹配的KMP算...

网友评论

    本文标题:KMP算法的一种解释

    本文链接:https://www.haomeiwen.com/subject/kxdbactx.html