KMP算法思考和分析
KMP算法是一个很优秀的算法,其中蕴含了创造者的思考。
KMP算法:KMP算法在执行的过程中对于两个字符串s1和s2,如果s1>s2,那么称s1为主串,s2为模式串,这样分是为了让模式串去在主串之中找位置,为了匹配模式串。
考虑KMP算法的思考过程:
对于子串s1和s2来说:
S1 = a b c d a b e
S2 = a b
1.
a b a d a b e
=
a b
2.
a b a d a b e
==
a b
3.
a b a d a b e
≠
a b
4.
a b a d a b e
=≠
a b
这个时候,如果再匹配到k的位置,发现已经不满足了,这个时候如果按照BF算法的思想,应该讲模式串右移一位重新开始匹配,但是我们发现a ≠ b,说明右移有效,也就是在模式串中我们就能发现到底是否有效。对于模式串应该移动多少位,我们可以定义next数组,next数组有两种定义的方法:
a b c a b e a a b c a a e
# 0 0 0 1 2 0 1 1 2 3 1 1
这个方法是因为主串和模式串的匹配实际上可以表示为模式串与模式串的自己匹配构成,通过记录自身可以匹配的最长信息,然后就可以实现了KMP算法,但是这个算法是由改进的余地的:
对于
a a a a a a a a
# 0 1 2 3 4 5 6
主串为:
a a a a a a a b aa a a a a a b a a a a a a a b…
对于匹配到b处的时候,会匹配6次,造成极大地浪费,因此next数组可以进行改进:
If(s[i] ==next[s[i]]) next[i] = next[next[i]];
这样可以加速,称之为改进的KMP算法。
存在KMP算法比BF算法运算量大的情况:
具体不太清楚,求大神指教~