字符串匹配问题本科生教材-.pptVIP

字符串匹配问题本科生教材-.ppt

此“教育”领域文档为创作者个人分享资料,不作为权威性指导和指引,仅供参考
  1. 1、本文档共22页,可阅读全部内容。
  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算法 如何消除朴素的模式匹配算法主串指针回溯所带来的复杂性? D.E.Knuth , V.R.Pratt和J.H.Morris提出的一个算法,简称为KMP算法。主要利用现有部分匹配的情况来达到消除回溯的目的。 1、前缀函数 next[q]=max{ l |0=lq-1 且p[0..l-1]是p[0..q-1]的后缀} 2、例2 ? 当p.c[q]与t.c[j]不相等时,模式串p向右滑动多少个位置,再比较,既不丢失可能的匹配,又不做回溯? 以例2为例,展示匹配和滑动的过程! 1) 求p0,p1,…,pq-1中最大相同的前缀与后缀的长度k; 2) next[q]=k 即: 当p.c[q]与t.ch[j]不相等时,模式串p向右滑动q- k 个位置,继续比较p.c[q]和t.c[j]。 依次类推,直至出现下列两种情形之一。 (1) q退到某个next值,next[next…next[ ]]]时,比较i位置的字符,如相等,若此时若还不是完全匹配(q≠m),则q与j值各自增加1,继续比较下一字符 (2)如,k=-1时,模板退回到第1个位置、主串向前进一个,继续比较。 当算法中出现p.ch[q]=t.ch[i],且q=m时,显然找到了一个匹配p[0..m-1]=t[i-m..i-1]这是算法返回主串中出现匹配的第一个字符的位置i-m. 3、KMP算法 4、求前缀函数 5、KMP算法的复杂性 前缀函数的复杂性 设主串s和模式串t的长度分别为n和m,且m=n。 在前缀函数的计算过程中,语句: while( i p-n -1) { while( k=0 p-c[i] != p-c[k]) k = next[k]; i++; k++; if (p-c[i] = = p-c[k]) next[I]=k; } 累计计算的次数不会超过m.苹果栏中苹果最多不超过m,所有从k减小成next[k]的次数都不会超过当前苹果栏中的苹果数 同理KMP算法中: while( i p-n j t-n) if(i= = -1 || p-c[i] = = t -c[j] ) { i++;j++;} else i=next[i]; 累计计算的次数最多不超过O(m+n)。 算法KMP_MATCHER的总计算时间为O(m+n)。 6、KMP算法的改进 算法KMP_MATCHER中比较p[q]和t[i]不相等,且p[q]=p[next[q]]时,不仅可以向右滑动q-next[q]个位置,而且更大一点,可以向右滑动 q-next[next[q]]个位置。因为 p[i]?t[j] 因此,可将前缀函数π修改为: * * 求串‘ababababca’的前缀函数π[] 0 6 5 4 3 2 1 0 0 -1 Next[] a c b a b a b a b a c d a b a b a b a b ? a b a b a b a b c c d a b a b a b a b ? ? ? a b a b a b a b c c d a b a b a b a b ? ? ? ? ? a b a b a b a b c c d a b a b a b a b ? ? ? ? ? a b a b a b a b c 可能存在匹配的位置 最后1个位置不匹配! int pMatch(PSeqString t, PSeqString p, int * next) { int i,j; i=0;j=0; while( i p-n j t-n) if(i= = -1 || p-c[i] = = t -c[j] ) { i++;j++;} else i=next[i]; /* i退回到next[i]-1后边那1个, 此时j没有变化 if ( i = p-n ) return (j- p-n +1) else return(0

文档评论(0)

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

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

1亿VIP精品文档

相关文档