《数据结构第八讲》-公开课件(设计).pptVIP

《数据结构第八讲》-公开课件(设计).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文档。上传文档
查看更多
* * 第八讲 串的模式匹配算法 习题课 1.串是一个 组成的有限序列。 由零个或多个字符 2.子串:串中 字符组成的子序列。 任意个连续的 3.子串的位置:子串在主串中第一次出现的 字符的位置。 第一个 4.如果b=‘JING’, d=‘BEI JING’,则b在d中的位置为( ) 5 5.若串S=’pencilor’,其非平凡子串的数目是( )。 35 6. 串的长度是指( ) A.串中所含不同字母的个数 B.串中所含字符的个数 C.串中所含不同字符的个数 D.串中所含非空格字符的个数 B 7.串有 种表示方法,分别是: 三,定长顺序存储表示,堆分配存储,块链存储表示 简单匹配算法,详细的见课本P80,其主串的指针I在不断的回溯,如i=3,变为i=2,i=7变为i=4… 其时间复杂度可达到O(n*m). KMP算法,其时间复杂度为:O(n+m), 如果主串i上的字符不匹配的时候,则主串i上的字符应该再与模式串上的那个字符相比较,也就是说,如果出现不匹配的时候,模式串应该“向右滑动”多远? 模式串的next函数定义如下: 假设此时应该与模式串中的第k(kj)个字符继续进行比较,则说明 模式串中前k-1个字符的子串必须满足下列关系,且不可能存在k’k满足下面的关系(1): ‘p1p2…p k-1’=‘si-k+1 si-k+2…si-1’ (1) 而已经得到的“部分匹配”的结果为: 由(1)和(2)得到: ‘p1p2…pk-1’=‘pj-k+1 pj-k+2…pj-1’ (3) ‘pj-k+1 pj-k+2…pj-1’=‘si-k+1 si-k+2…si-1’ (2) 反之,如果模式串中存在满足(3)的两个子串,则当匹配过程中,主串的第i个字符与模式串中第j个字符不相等时,仅需要将模式向右滑动至模式中第k个字符和主串中第i个字符对齐,继续比较。 注:next[j]仅取决于模式串本身而和相匹配的主串无关。下面推导其递推算法 显然:next[1]=0; 假设next[j]=k,则说明在模式串中存在: ‘p1p2…pk-1’=‘pj-k+1 pj-k+2…pj-1’ 怎么求next[j+1]? 如果pk=pj,则说明: ‘p1p2…pk-1 pk’=‘pj-k+1 pj-k+2…pj-1 pj’ 于是next[j+1]=k+1=next[j]+1 如果pk!=pj,则这又是一个模式匹配问题,其中主串和模式串相同 于是模式串应该向右滑动至pj与pnext[k]相对齐,继续比较,又分两种情况: pj= pnext[k]和pj与 pnext[k]不相等。 若pj= pnext[k],则next[j+1]=next[k]+1; 若pj!=pnext[k] , 则考察pj和pnext[next[k]] , 若pj=p next[next[k]] , 则next[j+1]=next[next[k]]+1 若pj!=p next[next[k]] ,则继续比较下去, 若pj!=pnext[next[k]]=p1, 即: next[next[k]]=1, 则next[j+1]=1. 例子:T=‘abaabcac’ next[3]=next[2+1], next[2]=1, 而p2!=p1, 所以next[3]=next[1]+1=1 next[4]=next[3+1], next[3]=1, 因为p3=p1,所以next[4]=next[3]+1=2 next[5]=next[4+1], next[4]=2, 而p4!=p2, 又next[2]=1, p4=p1, 所以,next[5]=next[2]+1=2. next[6]=next[5+1], next[5]=2, 因为p5=p2, 所以next[6]=next[5]+1=3. next[7]=next[6+1], next[6]=3, 而p6!=p3, next[3]=1, 又p6!=p1, 所以next[7]=1, next[8]=next[7+1], next[7]=1, 因为p7=p1, 因此next[8]=next[7]+1=2 仿照KMP算法,可得到求next函数值的算法如下: void get_next( SString T, i

文档评论(0)

小红帽 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档