串的模式匹配.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文档。上传文档
查看更多
串的模式匹配算法 雅礼 朱全民 串的基本操作 串的连接(concat) 求子串(substr--- Pascal中的copy函数) 插入函数(insert) 删除函数(delete) 定位函数(index--- Pascal中的pos函数) 模式匹配 算法框架 FUNC pos (p, s : string) : integer; {求模式串 t 在主串 s 中的位置的定位函数 } i:=1; j:=1 { 指针初始化 } WHILE ( i = length (s) ) and ( j= length (p) DO IF s [i] = p [j] THEN [ i:=i+1 ; j:=j+1] {继续比较后续字符} ELSE [i:=i-j+2; j:=1]; {指针后退重新匹配} IF j length (p) THEN RETURN (i – length (p) ) ELSE RETURN(0) ENDF; 复杂性分析:最坏情况为O(n*m) 例如: 模式串为 主串为: ‘0000000000000000000000000000000000000000000000000000000000001’ KMP(Knuth-Morris-Pratt)算法 KMP的基本原理 怎样求K KMP示例 KMP算法框架 FUNC KMP(p,t:string):integer; i:=1; j:=1 { 指针初始化 } WHILE ( i = length (s) ) and ( j= length (p) DO IF s [i] = p [j] THEN [ i:=i+1 ; j:=j+1] {继续比较后续字符} ELSE j:=next [ j ]; {模式串向右滑动next [ j ]} IF j length (p) THEN RETURN (i – length (p) ) ELSE RETURN(0) ENDF; 怎样求next[j]? 首先有,next[1]=0,设next[j]=k,表明: p1p2…pk-1= pj-k+1pj-k+2…pj-1 (1) 若pk= pj ,则在模式串中有, p1p2…pk= pj-k+1pj-k+2…pj 所以, next[j+1]=k+1 (2) 若pk pj ,则杂模式串中有 p1p2…pk pj-k+1pj-k+2…pj 则可将求next函数的问题看成整个模式串既是主串又是模式串的问题,应将模式串滑动到next[k]个字符和主串的第j个字符相比较.若next[k]=k’,且pj=pk’,则说明在主串中第j+1个字符之前存在一个长度为k’的最长子串,和模式串中从首字符起长度为k’的子串相等,即 p1p2…pk’ pj-k’+1pj-k+2…pj 也就是说next[j+1]=k’+1=next[k]+1 求NEXT算法 Proc get_next( t: string); { next为全程变量} j:=1 ; k:=0; next[1]:=0; While jlength (p) do if (k=0) or (p[j] = p[k]) then [ j:=j+1; k:=k+1;next[j]:=k] else k:=next[k] ENDP 扩展KMP算法 给定母串S,和子串T。定义n=|S|, m=|T|,extend[i]=S[i..n]与T的最长公共前缀长度。 请在线性的时间复杂度内,求出所有的extend[1..n]。 容易发现,如果有某个位置i满足extend[i]=m,那么T就肯定在S中出现过,并且进一步知道出现首位置是i——而这正是经典的KMP问题。 因此可见“扩展的KMP问题”是对经典KMP问题的一个扩充和加难。 一个例子 这里为了计算extend[1],我们进行了11次比较运算 分析 不然。 因为通过计算extend[1]=10,我们可以得到这样的信息:S[1..10]=T[1..10]?S[2..10]=T[2..

文档评论(0)

宝贝计划 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档