模式匹配之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的位置。
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的位置。
相关文章推荐
- 模式匹配之KMP算法的理解(二)
- 【模式匹配】KMP算法的简明理解
- 模式匹配算法(蛮力法与KMP算法的比较)
- 字符串模式匹配----KMP算法
- 字符串模式匹配的BF算法与KMP算法
- KMP算法 字符串模式匹配
- 改进的模式匹配算法——KMP算法
- 改进的模式匹配算法——KMP算法
- 改进的模式匹配算法——KMP算法
- 串的模式匹配——KMP算法
- 模式匹配――从BF算法到KMP算法
- 模式匹配算法-KMP算法
- 模式匹配---KMP算法
- C语言快速模式匹配(KMP算法)
- [转]模式匹配的KMP算法详解
- 字符串模式匹配KMP算法
- 串的模式匹配算法:BF和 KMP算法
- 字符串的模式匹配,KMP算法
- KMP算法 KMP模式匹配 一(串)
- 字符串与模式匹配(一)——KMP算法