您的位置:首页 > 其它

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
ps:上表中pattern为模式串,index为pattern的下标,next为要生成的next数组

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的代码在资源里有

有写的或理解的不正确的地方还请大家斧正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: