数据结构——用C语言描述(第二版) -宁正元 第4章 串.pptVIP

数据结构——用C语言描述(第二版) -宁正元 第4章 串.ppt

  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文档。上传文档
查看更多
第4章 串 4.1 串的基本概念 4.2 串的存储实现 4.3 串的模式匹配算法 4.4 汉字串 4.3.2 一种改进的模式匹配算法 D.E.Knuth与V.R.Pratt和J.H.Morris同时发现通过对上一节的简单模式匹配算法进行一些改进,就可以消除算法中主串s指针的回溯,完成串的模式匹配,而且算法可以在O(n+m)的时间数量级上完成串的模式匹配操作。人们把该改进算法称它为克努特-莫里斯-普拉特算法(简称为KMP算法),如图4.9模式匹配过程。可以看出,其改进之处在于整个匹配过程对主串而言无需回溯,每当某一趟匹配过程中出现字符比较不等即匹配失败时,目标串i指针不需要回溯,而是利用已得到的“部分匹配”的结果将模式向右移动尽可能远的一段距离后,继续进行比较,从而消除回溯。 一般的情况讨论如下: 假设主串s为“s1s2…sn”,模式串t为“t1t2...tm”,要设计一个无回溯的匹配算法,关键在于确定在匹配过程中,当主串中si与tj比较不等(即“失配”)时,模式串t中的哪一个字符应与si继续进行比较? 假设将这个字符记做tk,显然,有kj成立且对于不同的j值,k值也不相同,而且这个k值与主串s无关,而只依赖于模式串t本身的前j个字符。 若令next[j]=k,则当next[j]0时,表示一旦匹配过程中出现si与tj不相等时,可用t中的next[j]位置的字符继续与si比较;若next[j]=0,则表示t中任何字符都不与si比较,需重新比较t1与s i+1。 可见,对于任何的模式串t而言,只要能确定next[j](j=1,2,…,m)的值,就可以用来加速匹配过程。模式串的next函数的定义为: next函数的意义是:若模式串t中存在满足等式“t1t2…t k-1”=“t j-k+1 t j-k+2…t j-1”的两个子串,则当匹配过程中主串中第i个字符与模式中第j个字符比较不等时,仅需将模式向右移动至模式中的第k个字符和主串中的第i个字符对齐,匹配仅需从模式中的第k个字符与主串中的第i个字符继续比较即可,如图4.10所示。另外,若在“t1t2... tj-1”中不存在首尾相等的子串,则k=1,表示一旦有si与tj不相等时,则用t1与si继续进行比较。特别地,若j=1,当t1与si比较不相等时,此时不能继续右移,只要将t1与s i+1继续比较即可进行新一趟的匹配,所以在next定义中,next[j]=0。 同时,为使模式串t的右移不丢失任何匹配成功的可能,对于同时存在多个满足以上性质条件的k值应取最大值,以使得移动的位数i-k最小。 例如,图4.11中,s=“aaaabbb”,t=“aaab”,当s4与t4比较不相等时,k可取1,2和3,但只有k取3时才可保证不丢失成功的可能匹配。 在求得模式的next函数之后,匹配过程如下:若在匹配过程中有si=tj成立,则i和j分别增加1,否则,i不变,即主串指针不回溯,而j退到next[j]的位置再比较,即用tnext[j]与si继续比较,若此时相等,则指针各自增加1,否则j再退到下一个next[next[j]]值的位置,依此类推,直至出现下列两种可能的情况:一是j退到某个next值(next[next[...next[j]]])时,主串和模式串中的字符进行比较,若相等,则指针各自增1继续进行匹配;另一种情况是j退到值为0(即模式的第一个字符“失配”),此时需将模式继续向右移动一个位置,即从主串的下一个字符si+1起和模式重新开始匹配。 例如,对于模式串t=“abaabcac”: (1)j=1,next[1]=0; (2)j=2,没有首尾相等的子串,next[2]=1; (3)j=3,同样,也没有首尾相等的子串,next[3]=1; (4)j=4,存在首尾相等的子串“a”,所以next[4]=2; ……. 其余类推,从而可求得t所对应的next函数,如图4.12(a)所示。匹配过程如图4.12(b)所示。 KMP算法描述如下: int KMP(SeqString *s, SeqString * t, int start) { if ((start 1)||( start +(*t).len(*s).len+1)||(*t).len= =0)} return (0); else {i= start;j=1; while ((i=(*s).len) (j=(*t).len)

您可能关注的文档

文档评论(0)

118压缩包课件库 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档