您的位置:首页 > 其它

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

2008-12-16 22:39 344 查看
这几天一直都在看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的位置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: