kmp字符串模式匹配.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
个人觉得这篇文章是网上的介绍有关 KMP算法更让人容易理解的文章了,确实说 得很“详细”,耐心地把它看完肯定会有所收获的??,另外有关模式函数值 next[i]确实有很多版本啊,在另外一些面向对象的算法描述书中也有失效函数 f(j)的说法,其实是一个意思,即next[j]=f(j-1)+1 ,不过还是next[j]这种表 示法好理解啊: KMP字符串模式 匹配详解 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高 效算法。简单匹配算法的时间复杂度为 0(m* n);KMP匹配算法。可以证明它的时 间复杂度为0(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: int Index_BF ( char S [ ], char T [ ], int pos) { /*若串S中从第pos(S的下标Ow posvStrLength(S))个字符 起存在和串T相同的子串,则称匹配成功,返回第一个 这样的子串在串S中的下标,否则返回-1 */ int i = pos, j = 0; while ( S[i+j] != \0 T[j] != \0) if ( S[i+j] == T[j]) j ++; //继续比较后一字符 else { i ++; j = 0; //重新开始新的一轮匹配 } if ( T[j] == \0) return i; // 匹配成功 返回下标 else return -1; //串S中(第pos个字符起)不存在和串T相同的子串 } //Index_BF 此算法的思想是直截了当的:将主串 S中某个位置i起始的子串和模式串T 相比较。即从j=0起比较S[i+j] 与T[j],若相等,则在主串S中存在以i为 起始位置匹配成功的可能性,继续往后比较 (j逐步增1 ),直至与T串中最后 一个字符相等为止,否则改从 S串的下一个字符起重新开始进行下一轮的匹配 ,即将串T向后滑动一位,即i增1,而j退回至0,重新开始新一轮的匹配。 例如:在串 s=” abcabcabdabba” 中查找 T=” abcabd ” (我们 可以假设从下标0开始):先是比较S[0]和T[0]是否相等,然后比较S[1]和T[1] 是否相等,我们发现一直比较到 S[5]和T[5]才不等。如图: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 a b c a |b c a b d a b b a \o i /、 r *『 \ 八 f V V / V 1 b c a b d l\o 0 1 2 3 4 5 6 当这样一个失配发生时,T下标必须回溯到开始,S下标回溯的长度与T 相同,然后S下标增1,然后再次比较。如图: 这次立刻发生了失配,T下标又回溯到开始,S下标增1,然后再次比较。 如图: 0 1 2 3 4 5 6 7 W 9 10 11 12 13 S b|c a |b|c |a |b|d|a|b b|a|\o| /fl 7 w * T a b c a b d 0 12 3 4 5 6 这次立刻发生了失配,T下标又回溯到开始,S下标增1,然后再次比较 如图: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 S Mlbl? 辺| bdajbld 忸 EEEM a b c a b d \o 0 12 3 4 5 6 又一次发生了失配,所以T下标又回溯到开始,S下标增1,然后再次比较。 这次T中的所有字符都和S中相应的字符匹配了。函数返回T在S中的起始下标 3。如图: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 Slab clalbic a bldia lb b a \ol J J、 V 个 V V V T ; 2 b * c a k d \o | 0 1 2 3 4 5 6 .KMP匹配算法 还是相同的例子,在s=” abcabcabdabba”中查找t=” abcabd” 如果使用KMF匹配算法,当第一次搜索到S[5]和T[5]不等后,S下标不是回溯 到1,T下标也不是回溯到开始,而是根据 T中T[5]== d的模式函数值 (next[5]=2,为什么?后面讲),直接比较S[5]和T[2]是否相等,因为相等, S和T的下标同时增加;因为又相等,S和T的下标又同时增加。。。最终在 S 中找到了 T。如图: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 a b|c|ai b c a bld |a b b a|\o| f * a b c a b d \o 0 12 3 4 5 6 KMF匹配算法和简单匹配算法效率比较,一个极端的例子是: 在s= “aaaaaa,aaB(ioo 个A)中查找t=” aaaaaaaaAb 简单匹配算法 每次都是比较到T的结尾

文档评论(0)

dajiede + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档