Zn http://spaces.msn.com/znzhou/ 模式匹配与KMP算法 Zn http://spaces.msn.com/znzhou/ 2006-4-9
OUTLINE 什么是模式匹配 朴素匹配算法 KMP算法 效率对比 更多模式匹配算法 2006-4-9
OUTLINE 什么是模式匹配 朴素匹配算法 KMP算法 效率对比 更多模式匹配算法 2006-4-9
哪个是今天要讨论的模式匹配 the The quick brown fox jumps over the lazy dog jay 2006-4-9
模式匹配 Finding all occurrences of a pattern in a text eg. 'abc' in 'acbcdabc' 2006-4-9
OUTLINE 什么是模式匹配 朴素匹配算法 KMP算法 效率对比 更多模式匹配算法 2006-4-9
The naive string-matching algorithm ababcabcacbab abcac How does it work? 2006-4-9
a b a b c a b c a c b a b a b c a c a b a b c a b c a c b a b 第一次匹配 a b c a c a b a b c a b c a c b a b 第二次匹配 a b c a c a b a b c a b c a c b a b 第三次匹配 a b c a c 2006-4-9
a b a b c a b c a c b a b a b c a c a b a b c a b c a c b a b 第四次匹配 a b c a c a b a b c a b c a c b a b 第五次匹配 a b c a c a b a b c a b c a c b a b 第六次匹配 a b c a c 2006-4-9
while(s[i]!=0&&j<length) if(s[i]==t[j]){i++;j++;} int Normal(int pos) { int i,j; i=pos;j=0; while(s[i]!=0&&j<length) if(s[i]==t[j]){i++;j++;} else{i=i-j+1;j=0;} } if(j==length) return i-length; else return -1; 2006-4-9
复杂度分析 一般情况 效率可以近似认为O(m+n) 极端特殊情况 O(mn) 2006-4-9
OUTLINE 什么是模式匹配 朴素匹配算法 KMP算法 效率对比 更多模式匹配算法 2006-4-9
What’s KMP? 2006-4-9
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岁!后来,此书与牛顿的“自然哲学的数学原理”等一起,被评为“世界历史上最伟大的十种科学著作”之一。 Donald E. Knuth,1938年出生于Wisconsin。1960年,当他毕业于Case Institute of Te chnology数学系时,因为成绩过于出色,被校方打破历史 惯例,同时授予学士和硕士学位。他随即进入大名鼎鼎的加州理工学院 数学系,仅用三年时间便取得博士学位,此时年仅25岁。 毕业后留校任助理教授,28岁时升为副教授。30岁时,加盟斯坦福大学计 算机系,任正教授。从31岁那年起,他开始出版他的历史性经典巨著: The Art of Computer Programming。他计划共写7卷,然而仅仅出版三卷 之后,已经震惊世界,使他获得计算机科学界的最高荣誉Turing Award! 此时,他年仅38岁!后来,此书与牛顿的“自然哲学的数学原理”等一起, 被评为“世界历史上最伟大的十种科学著作”之一。相信学过数据结构和编 译原理的同学们都知道KMP算法和LR(K)算法有多么不可思议,然而此书 中这样的算法比比皆是! 在计算机科学上,他主要是一位理论家。然而,他在理论以外也同样做出 惊人的成就。鼎鼎大名的排版软件Tex,就是他的作品。此外,还有Metafont 等,也在世界上得到广泛使用。 Knuth获得图灵奖时为36岁,前面多说了两岁。估计他可能是历史上最年轻的图灵奖 获得者,甚至有可能永远把这个记录保持下去。 相比之下,其他获得图灵奖的人当时一般都是五十几岁或者六十几岁(例如去年的 姚先生,和刚去世的Simon),可见Knuth有多伟大!他真不愧为大师中的大师! 他很早就提前退休,为的是集中精力把巨著The Art of Computer Programming写完。 他一生共带过二十四个(此数字也许不准)博士生,发誓不会再带更多的学生。但是, 他有一个奇妙的承诺: 在他定期进行的讲座中,会不断提出一些新的难题。如果有人能在给定的期限内解出 任何一道难题,他将为那个人的博士论文签名!不知道 世界之大,有没有哪位后起之秀能获得这样的殊誉? 他的其它著作和论文难以数计,其中包括Concrete Mathematics等名著。 从1977年起,他获得Fletcher Jones Professor of Computer Science的 头衔,并且同时兼任Professor of Electrical Engineering。1990年,斯坦 福大学更授予他一个非同寻常的头衔Professor of The Art of Computer Science,作为对他的特殊贡献的承认! 他的其它荣誉数不胜数,其中主要的有:美国国家科学院院士,美国艺术 与科学院院士,美国工程院院士,法国科学院外籍院士,挪威科学院外籍 院士.......;美国数学会Steele奖,瑞典皇家科学院Adelskold奖,以色列 工学院Harvey奖,IEEE冯诺依曼奖,东京高科技奖...... 共达数十个之多。 同时,他还是牛津大学等二十几所大学的荣誉博士。早在1970年,他就在 国际数学大会上做过特邀报告。建议感兴趣的同学参观他的竹叶: http://www-cs-faculty.stanford.edu/~knuth/ 2006-4-9
The KMP string-matching algorithm abbcaccabbaabcababcdbac abcd How does it work? 2006-4-9
a b a b c a b c a c b a b a b c a c a b a b c a b c a c b a b 第一次匹配 a b c a c a b a b c a b c a c b a b 第二次匹配 a b c a c a b a b c a b c a c b a b 第三次匹配 a b c a c 2006-4-9
Next[j] 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 j 0 1 2 3 4 模式串 a b c a c Next[j] -1 0 0 0 1 2006-4-9
int KMP(char*t,int pos) { int i,j; i=pos; j=0; while(s[i]!=0&&j<length) if(j==-1||t[j]==s[i]){i++;j++;} else{j=next[j];} } if(j==length) return i-j; else return -1; 2006-4-9
复杂度分析 O(m+n) 2006-4-9
How to gain next[j]? 2006-4-9
以眼杀人--观察法 a a a b c a c b a b a a b c a c -1 1 1 2 1 2006-4-9
Exercise a b c a b a a b c b c -1 0 0 0 1 2 1 1 2 0 0 a b a b a b a b -1 0 0 1 2 3 4 5 a a b a a c a a d a -1 0 1 0 1 2 0 1 2 0 2006-4-9
S a b a a b c a c T Next[i] -1 1 1 2 1 程序实现 If(j==-1||s[j]==t[i]) Else 1 1 2 1 If(j==-1||s[j]==t[i]) i++;j++;next[i]=j; Else j=next[j] 2006-4-9
void CalcNext(char*t) { int i,j; i=0; next[0]=-1; j=-1; while(i<length-1) if(j==-1||t[i]==t[j]){i++;j++;next[i]=j;} else{j=next[j];} } 2006-4-9
OUTLINE 什么是模式匹配 朴素匹配算法 KMP算法 效率对比 更多模式匹配算法 2006-4-9
朴素算法与KMP算法的比较 复杂度 使用资源 效率 2006-4-9
KMP算法的改进 一个例子 模式串:aaaab 主串: aaabaaaab j 0 1 2 3 4 模式 a a a a b Next[j] 0 1 2 3 4 模式 a a a a b Next[j] -1 0 1 2 3 Nextval[j] -1-1 -1 -1 3 2006-4-9
OUTLINE 什么是模式匹配 朴素匹配算法 KMP算法 效率对比 更多模式匹配算法 2006-4-9
更多模式匹配算法 Boyer-Moore算法 这个算法KMP算法的不同点是在作s[k+1..k+m]与t[1..m]的匹配测试时是从右到左,而不是从左到右。 Rabin-Karp算法 这个算法用到数论中诸如两个整数关于第三个整数取模的等价性等初等概念。 2006-4-9
SUMMARY 什么是模式匹配 朴素匹配算法 KMP算法 效率对比 更多模式匹配算法 2006-4-9
THANK YOU! Zn http://spaces.msn.com/znzhou/ 2006-4-9