- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
什么是模式匹配 朴素匹配算法 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岁!后来,此书与牛顿的“自然哲学的数学原理”等一起,被评为“世界历史上最伟大的十种科学著作”之一。 KMP算法 主串: abcdefgabcdab 模式串: abcdex How does it work? a b c d e f g a b c d a b a b c d e x 第三次匹配 第二次匹配 第一次匹配 a b c d e f g a b c d a b a b c d e x a b c d e f g a b c d a b a b c d e x a b c d e f g a b c d a b a b c d e x 第六次匹配 第五次匹配 第四次匹配 a b c d e f g a b c d a b a b c d e x a b c d e f g a b c d a b a b c d e x 观察: 1、T串中首字符a 与后面字符都是不相等的 2、T串中的a与S串后面的b, c, d, e也都可以在第一次匹配之后就确定是不相等的 结论:第二、三、四、五次匹配没有必要,只需保留第一、六次匹配,也即 i 的值没有必要回溯 问题:T串后面含有首字符a怎么办? 主串: abcababcabc 模式串: abcabx a b c a b a b c a b c a b c a b x 第三次匹配 第二次匹配 第一次匹配 a b c a b x a b c a b x a b c a b a b c a b c a b c a b a b c a b c a b c a b x 第四次匹配 a b c a b a b c a b c 结论:i的值不可以变小,变化的是j的值,j值多少取决于当前字符之前的串的前后缀的相似程度 KMP算法原理: 假设现在文本串S匹配到 i 位置,模式串T匹配到 j 位置 如果当前字符匹配成功(即S[i] == T[j]),则令i++,j++,继续匹配下一个字符; 如果当前字符匹配失败(即S[i] != T[j]),则令 i 不变,j = next[j] (next[j] = j – 1)。此举意味着失配时,模式串T相对于文本串S向右移动了j - next [j] (至少为1) 位。 关键: 如何求next[j] next[j]: next[j]= 0, 当j=1时 1, 其他情况 Max{k|1kj, 且p1…pk-1 = pj-k+1…pj-1} 当此集合不空 j 1 2 3 4 5 模式串 a b c a c next[j] 0 1 1 1 2 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 1 2 3 4 5 6 7 8 9 模式串 a b a b a a a b a next[j] 0 1 1 2 3 4 2 2 3 J=1时,next[1]=0 J=2时,只有字符a,属其他情况,next[2]=1 J=3时,j由1到j-1的字符串是ab,a与b不等,属其他情况,next[3]=1 J=4时,j由1到j-1的字符串是aba,前缀字符a与后缀字符a相等,可得到k=2,故next[4]=2 J=5时,j由1到j-1的字符串是abab,前缀字符ab与后缀字符ab相等,可得到k=3,故next[5]=3 J=6时,j由1到j-1的字符串是ababa,前缀字符aba与后缀字符aba相等,可得到k=4,故next[4]=4 … void Get_Next(String T, int *next) { int i,j; i=1; j=0;
文档评论(0)