模式匹配之KMP算法的理解(一)

        这几天一直都在看KMP这个算法,原先就是仅仅的看原来的数据结构教程,虽然上面给出了算法,但是一直不得其要领,不知道为什么要那样写,到底是什么道理,决心这次不能像以前一样不求甚解了。所以在网上找了一些讲解这个算法的文章看,还是一知半解,大多数的文章讲的都是程序,而对于原理的解释讲的少之又少。快抓狂的时候找到了严蔚敏的数据结构,这本书上讲的比较清楚,不过还是花了一番功夫终于搞清楚整个过程了,一下来分享一下:
       KMP算法的由来就不用讲了么,就是名字中有这个三个字母的人提出的一种模式匹配算法。主要思想是利用之前比较过的信息过滤掉不必要的比较。
       比如主串如下:S="s1s2.......sn",模式串表示为“P=p1p2.....pm”(m<n).在匹配的过程中,当比较pj与si时,两者不相等,但是考虑到已经有了“p1p2......pj-1”与
"s(i-j+1)s(i-j+2).......s(i-1) "相等。KMP算法就是利用这个已有信息,使得模式串下次与si比较的字符为第k个字符。那么就有等式
               
"p1p2.......p(k-1)" ="s(i-k+1)s(i-k+2).......s(i-1)".(1)
         而已经得到的部分匹配的信息为
                 
"s(i-k+1)s(i-k+2).......s(i-1)"=“p(j-k+1)p(j-k+2).......p(j-1)”.(2)
         根据以上(1)(2)就可以有等式
  "p1p2.......p(k-1)"= “p(j-k+1)p(j-k+2).......p(j-1)”. (3)
         反过来,如果模式串中存在着满足(3)的公式的字符串,那就可以直接将模式串pk与si比较。那么剩下的主要工作是找到这个k的位置。

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值