Good,True and Beautiful

Good Good Study, Day Day Up

导航

今天学习了下 KMP算法

即:Knuth-Morris-Pratt 字符串查找算法,即查找字符串B在字符串A中的位置

目标字符串(A):target   adczdfdadfadf

查找的子串(B): pattern  adfaerw

-------------------------

普通比较算法

一个一个比较,匹配失败时,又从pattern的头开始,并且 target的指针也回退。

比如:第一轮(从A[0]开始) 匹配 到 A[2]!=B[2] 时,会继续第二轮,此时A的指针已指到C,但第二轮又会退到1,继续比较A[1],A[2]

如果,可以利用 B的一些特性,就可以不用再重复比较已比较过的,相反移动B就可以,而不用回退A的搜索指针。而移动的距离即是我们要查找的值。

寻找模式特性(最大首尾匹配值):

字符串S,长度L(>0),起始下标0

满足 S0S1....Sk=SL-1-kSL-k.....SL-1 的最大K值 即为 我们要找的K值,没有或L=1则为起始下标减一。

利用:假设我们已经比较到B下标的L,即已匹配了B的位置0~L-1的子串C,发现位置L处不匹配,那么我们将B移动,m(子串C的最大首尾匹配值)个位置,这样我们已经匹配的就可以不用再匹配了。

KMP算法即是采用上面的这种方法

KMP算法

准备工作:计算B所有从头开始的子串的最大k值

算法开始:(假设起始下标为x,一般为0)

0 判断 i<A的长度 并且j小于B的长度,不符合 跳到3

1 比较A[i],B[j]:

1.1匹配则移动i,j (这里移动采用步进,即向前移动1)

1.2 不匹配时:如果j为x, 步进i,否则 移动j,新j值为k+1

2 继续第0步

3 判断j是否等于B的长度,等于则返回i-j,不等于则返回x-1即未找到

4 结束

-------------------------  本来是准备写-----------------------------------

---------------------- 目前 各个语言 都有 字符串 查找的 函数 ,所以。。。。。-------------------

参考:http://saturnman.blog.163.com/blog/static/5576112010969957130/

        http://zh.wikipedia.org/wiki/KMP算法

 


posted on 2012-04-02 23:09  Simple Love  阅读(221)  评论(0编辑  收藏  举报