KMP算法

最近看opencv的模板匹配,意外搜到kmp算法(字符串模板匹配算法),就看了下,现在予以记录,以备后面回顾学习。

先做概念及测试用例:

前缀:abcd的前缀有a,ab,abc。

后缀:abcd的后缀有d,cd,bcd。

A串:a c a b c a a b a b c d a b(匹配串)

B串:a b c a a b c a a c a b(模板串)

kmp算法核心next数组,以下是B串手动模拟的next[]:

 0 1 2 3 4 5 6 7 8 9 10 11

    a b c a a b c a a c  a   b

-1 0 0 0 1 1 2 3 4 5 0 1   2

kmp算法本人粗见如下:

字符串的朴素匹配是将B串与A串比较,若不匹配就将A串后移一个继续比较,这样做很好理解,却放弃了很多可以提高效率的已知信息,如下

A串:a c a b c a a b a b c d a b

B串:      a b c a a b c a a c a b

以上匹配我们已知B串与A串匹配前6个字符,下一步匹配也就知道了A.at(2)到A.at(7)字符,那我们为什么还要死板的从A串的第A.at(3)字符重新比较。

所以kmp算法的next数组就是将这些信息利用起来,得到下一次匹配A串的位子,而不是单纯的+1。

如上的例子,根据kmp下一次比较A串的坐标为:2+6-2=6(当前坐标+匹配字符数-对应next[]的值),所以从A.at(6)开始匹配。

下面说说next[]数组的计算

next值为匹配的字符串的(前缀==后缀)的最大值,如abcaab的next值计算

(前缀:a,ab,abc,abca,abcaa==后缀:b,ab,aab,caab,bcaab)为ab所以为2。

 

posted @ 2017-07-17 16:54  共祝愿  阅读(149)  评论(0编辑  收藏  举报