KMP字符串(DOC可编).docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
KMP字符串(DOC可编).doc

KMP算法过程 KMP,也就是字符串的匹配算法,这个KMP不是电脑上的那种播放器,KMP是D.E.Knuth与V.R.Pratt和J.H.Morris 我们来看看KMP是怎么工作的。我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。 也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符(j当然越大越好),现在需要检验A[i+1]和B[j+1]的关系。当A[i+1]=B[j+1]时,i和j各加一; 什么时候j=m了,我们就说B是A的子串(B串已经整完了),并且可以根据这时的i值算出匹配的位置。当A[i+1]B[j+1],KMP的策略是调整j的位置(减小j值)使得A[i-j+1..i]与B[1..j]保持匹配且新的B[j+1]恰好与A[i+1]匹配(从而使得i和j能继续增加)。 注:蓝色段落转自 OK,模拟KMP算法过程! A[]=abcaabababaca B[]=ababc (本来想写成Pascal格式的,但是写了之后还是觉得C语言的形式比较好写,将就着看吧) 在这看来,这个一对字符串是没有匹配位置的,这都不管,能匹配的话大家都能看出,我们这要的是遇到那些不能匹配的时候的过程 初始化状态... 在这里,我们要做的第一个条件是求出NEXT指针,这个NEXT指针是在子串上做的,就是子串的自匹配,其实这个过程跟子母串的匹配很像,可以说基本上就是一样的 这个是已经自匹配好了的,详细过程就看子母串的匹配就是了 我们从 第二个位置 开始,因为前面一样,所以就没必要做前面的过程了 此时的 i = 2 ,同时 j = 2 ,因为 A [ i ] = B [ j ] ,所以 j 的值不变,那么再次对比下一个位置的字符,就是 A [ i + 1 ] 是否等于 B [ j + 1 ] 。显然现在看来是不等的,那么怎么办?这次匹配失败了,那么就只有把 j 指针往回推了,在 NEXT指针中,NEXT[ j ] = 0 ,此时 j = NEXT[ j ],也就是 j = 0 为什么呢?因为在匹配失败了之后,再在子串中寻找一个可以与母串再次匹配的位置(就是看前面有没有一个 b 的后面是跟着 c 这个字符的位置),但是往回找的话却发现不存在,那么就只有重头开始对比了 此时 i = 2 , j = 0 继续匹配 (不懂为什么跳转到0位置的,上去看NEXT数组) 进行 i++ j++ 则i = 3 , j = 1 这个时候进行对比发现,A [ i ] B [ j ] ,然后 j 再次跳转 j=NEXT[ j ] ,因为 j = 1 ,看NEXT指针中 NEXT[ j ] = 0 ,所以 j = 0 i = 3 再次进行 i++ j++ i = 4 j =1 看到A [ i ] = B [ j ] 则判断 A [ i + 1 ] ?=? B [ j + 1] ,还是不相同,这下 j 又得跳回0 继续 i++ j++ i = 5 j = 1 我们看 当j = 4 的情况 , 因为中间的匹配过程是一样的就跳过 我们看到这个一直到 i = 8 j = 4 的时候都能匹配,那进行下一步判断 A [ i + 1 ] ?=? B[ j + 1 ] 这时又是不匹配 ,NEXT [ j ] == 2 , j = NEXT [ j ] 这样 j = 2 了 再次匹配 A [ i + 1 ] ?=? B [ j + 1 ] ,进行算法过程 直到 j = 4 时 已经匹配到了 i = 10 j = 4 的情况了,A [ i + 1 ] B [ j + 1 ] ,现在匹配失败, j跳回2 判断 A [ i + 1 ] == B [ j + 1 ] , i++ j++ 继续到 i = 11 j = 3 发现A [ i + 1 ] 与 B [ j + 1 ] 无法匹配 ,使j 跳回 1 这个时候算法结束,因为当j = 1 之后,i = 11 ,从 j = 1 开始匹配的话就会发现A串长度不够,发现这个字符串无法匹配,母串中根本就没有包括这个子串,所以结束 来看看代码 ---------------------------------------------------------------------------------------------------------- 其实上面那个C语言的就是按照这个转过去的

文档评论(0)

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

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

1亿VIP精品文档

相关文档