- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
模式匹配与KMP算法-Read.ppt
模式匹配与KMP算法
Zn /znzhou/
OUTLINE
什么是模式匹配
朴素匹配算法
KMP算法
效率对比
更多模式匹配算法
OUTLINE
什么是模式匹配
朴素匹配算法
KMP算法
效率对比
更多模式匹配算法
哪个是今天要讨论的模式匹配
the
The quick brown fox jumps over the lazy dog
jay
The quick brown fox jumps over the lazy dog
模式匹配
Finding all occurrences of a pattern in a text
eg. abc in acbcdabc
OUTLINE
什么是模式匹配
朴素匹配算法
KMP算法
效率对比
更多模式匹配算法
The naive string-matching algorithm
ababcabcacbab
abcac
How does it work?
a b a b c a b c a c b a b
a b a b c a b c a c b a b
a b a b c a b c a c b a b
a b c a c
a b c a c
a b c a c
第一次匹配
第二次匹配
第三次匹配
a b a b c a b c a c b a b
a b a b c a b c a c b a b
a b a b c a b c a c b a b
a b c a c
a b c a c
a b c a c
第六次匹配
第五次匹配
第四次匹配
int Normal(int pos)
{
int i,j;
i=pos;j=0;
while(s[i]!=0jlength)
{
if(s[i]==t[j]){i++;j++;}
else{i=i-j+1;j=0;}
}
if(j==length)
return i-length;
else
return -1;
}
复杂度分析
一般情况
效率可以近似认为O(m+n)
极端特殊情况
O(mn)
OUTLINE
什么是模式匹配
朴素匹配算法
KMP算法
效率对比
更多模式匹配算法
What’s KMP?
Knuth-Morris-Pratt
Professor Emeritus of The Art of Computer Programming at Stanford University, welcomes you to his home page.
Donald E. Knuth,1938年出生于Wisconsin。1960年,当他毕业于Case Institute of Technology数学系时,因为成绩过于出色,被校方打破历史惯例,同时授予学士和硕士学位。他随即进入大名鼎鼎的加州理工学院数学系,仅用三年时间便取得博士学位,此时年仅25岁。 毕业后留校任助理教授,28岁时升为副教授。30岁时,加盟斯坦福大学计算机系,任正教授。从31岁那年起,他开始出版他的历史性经典巨著:The Art of Computer Programming。他计划共写7卷,然而仅仅出版三卷之后,已经震惊世界,使他获得计算机科学界的最高荣誉Turing Award!此时,他年仅38岁!后来,此书与牛顿的“自然哲学的数学原理”等一起,被评为“世界历史上最伟大的十种科学著作”之一。
The KMP string-matching algorithm
abbcaccabbaabcababcdbac
abcd
How does it work?
a b a b c a b c a c b a b
a b a b c a b c a c b a b
a b a b c a b c a c b a b
a b c a c
a b c a c
a b c a c
第三次匹配
第二次匹配
第一次匹配
Next[j]
j
0 1 2 3 4
模式串
a b c a c
Next[j]
-1 0 0 0 1
a b a b c a b c a c b a b
a b c a c
a b c a c
a b c a c
int KMP(char*t,int pos)
{
int i,j;
i=pos;
j=0;
while(s[i]!=0jlength)
{
if(j==-1||t[j]==s[i]){i++;j++;}
else{j=next[j];}
}
if(j==length)
return i-j;
else
return -1;
}
复杂度分析
O(m+n)
How to gain next[j]?
以眼杀人--观察法
a b a a b c a c
-1
1
1
2
0
文档评论(0)