chap4.2 串的模式匹配.pptVIP

  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文档。上传文档
查看更多
首尾匹配算法 假设开始比较的位置为pos i=(pos ---S[0]) j(1—T[0]) 从pos位置开始进行字符串的匹配比较 每次一般j=1 S[i]==T[1] 再比较T[T[0]]==S[ I+T[0]-1 ] 首尾均相等的话 拿j(2—T[0]-1)的字符逐一和S[i+j-1] 模式匹配的一种改进算法(KMP算法) 其改进在于:每当一趟匹配过程中出现字符比较不相等时,不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。 通过已经走过的路,可以求出下一个j开始的位置,j=1/j越大越好 模式串 “abaabcac” 算法思想 主串:s: ‘s(1) s(2) s(3) ……s(n)’ ; 模式串 :p: ‘p(1) p(2) p(3)…..p(m)’;假设 主串第i个字符与模式串的第j(j=m)个字符‘失配’后,主串第i个字符与模式串的第k(kj)个字符继续比较   此时,s(i)≠p(j), 有   主串: S(1)…… s(i-j+1)…… s(i-1) s(i) ………….   || (相配) || ≠(失配)   匹配串: P(1) ……. p(j-1) p(j) 算法思想 由此,我们得到关系式   ‘p(1) p(2) p(3)…..p(j-1)’ = ’ s(i-j+1)……s(i-1)’   由于s(i)≠p(j),接下来s(i)将与p(k)继续比较,则模式串中的前(k-1)个字符的子串必须满足下列关系式,并且不可能存在 k’k 满足下列关系式:(kj),   ‘p(1) p(2) p(3)…..p(k-1)’ = ’ s(i-k+1)s(i-k+2)……s(i-1)’   即:   主串: S(1)……s(i-k +1) s(i-k +2) ……s(i-1) s(i) ………….   || (相配) || || ?(有待比较)   匹配串: P(1) p(2) …… p(k-1) p(k) 方法:从当前位置i处,查找前面的子串是否存在相同从p(1) p(2) p(3)…..p(k-1)的字符,于是K就是下次开始查找的位置j=K 现在我们把前面总结的关系综合一下   有:   S(1)…s(i-j +1)… s(i-k +1) s(i-k +2) …… s(i-1) s(i) ……   || (相配) || || || ≠(失配)   P(1) ……p(j-k+1) p(j-k+2) ….... p(j-1) p(j)   || (相配) || || ?(有待比较)   P(1) p(2) ……. p(k-1) p(k)   由上,我们得到关系:   ‘p(1) p(2) p(3)…..p(k-1)’ = ’ s(j-k+1)s(j-k+2)……s(j-1)’ 主串i,子串j  ‘p(1) p(2) p(3)…..p(j-1)’ = ’ s(i-j+1)s(i-j+2)……s(i-1)’ P(1)=S[i-j+1] p[2]= S[i-j+2] P[j-1]=S[i-1]但是P[j]!=S[i] 加上存在一个小串 p[k]=S[i-1] P[k-1]=S[i-2] P[k-2]=S[i-3] ……P[1]=S[i-k] next[]=K+1; ‘p1p2…pk-1’=‘pj-k+1pj-k+2…pj-1’ 假设主串为‘s1s2…sn’,模式串为‘p1p2…pn’ 假设此时应与模式中的第k(kj)个字符进行比较,那么模式中前k-1个子串必须满足什么关系了呢? ‘p1p2…pk-1’=‘si-k+1si-k+2…si-1’ 已经得到的匹配结果是什么? ‘pj-k+1pj-k+2…pj-1’=‘si-k+1si-k+2…si-1’ 从而我们得到: ‘p1p2…pk-1’=‘pj-k+1pj-k+2…pj-1’ 求next值的方法 一种是不依赖next数组值直接用观察法求得 一种方法是根据next数组值进行推理,两种方法均可使用,视更喜欢哪种方法而定。 ”aaab“模式串 Next[1]=0 Next[2]=1 Next[3]=2 Next[4]=3 KMP经典思想 像这样的T,前面自身部分匹配的部分不止两个,那应该往前跳到第几个呢?最近的一个,也就是说尽可能的向右滑移最短的长度 next值表达的就是T串的自身部分匹配的性质,那么,我只要将T串和T串自身来一次匹配就可以求出来了, 若令next[j]=k,则next[j]表明当模式中第j个字符与主串中相应字符失配时,在模式中需要重新和主串中该字符进行比较的字符的位置,则next函数的定义为: N

文档评论(0)

海川电子书城 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档