串匹配问题及其算法分析.docVIP

  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文档。上传文档
查看更多
串匹配问题及其算法分析

串匹配问题及其算法分析 赵丽娜 (陕西师范大学 计算机科学学院 计算机科学与技术3班 学号 摘要:串匹配问题是算法设计中的经典问题,本文主要通过对BF算法,KMP算法和BM算法的研究,分析这三种算法在求解串问题时的优缺点并进行了比较。 关键词:串匹配问题 BF算法 BM算法 KMP算法 比较 问题描述 何为“串匹配问题”?给定两个串S=”t1t2...tn”和T=”t1t2…tm”,在主串S中查找子串T的过程称为串匹配(也称为模式匹配),T称为模式。在文本处理系统、操作系统、编译系统、数据库系统以及Internet信息检索系统中,串匹配是使用最频繁的操作。串匹配问题的算法复杂程度不高,并且具有下面两个特征:(1)问题规模n很大,常常需要在大量的信息中进行匹配,因此,算法的一次执行时间不容忽视;(2)匹配操作经常被调用,执行频率高,因此,算法改进所取得的效益应积累往往比表面上看起来要大得多。 求解串匹配问题的常见算法 BF算法 BF算法是应用蛮力法解决串匹配问题的:从主串S的第一个字符开始和模式T的第一个字符进行比较,若相等,则继续比较二者的后续字符;若不相等,则从主串S的第二个字符开始和模式T的第一个字符开始比较,重复上述过程,若T中的字符全部比较完毕,则说明本趟匹配成功;若最后一轮匹配的起始位置是n—m,则主串中剩下的字符不足够匹配整个模式T,匹配失败 伪代码如下: 在串S和串T中设比较的起始下标i和j; 循环直到S中所剩字符个数小于T的长度或T的所有字符均比较完 2.1如果S[i]=S[j],则继续比较S和T的下一个字符;否则 2.2将i 和j 回溯,准备下一趟比较; 3、如果T中所有字符均比较完毕,则匹配成功,返回匹配的起始比较下标; 否则,匹配失败,返回0; BF算法简单但是效率很低,造成其效率低的原因是回溯,即在某趟匹配失败后,对于 串S要回溯到本趟匹配开始字符的下一个字符,串T要回溯到第一个字符,而这些回溯往往是不必要的。 KMP算法 KMP算法的基本思想是主串不进行回溯。即希望某趟在Si和Sj匹配失败后,指针i不回溯,模式T向右滑动至某个位置k,使得Tk对准Si继续进行匹配。也就是利用已经部分匹配的结果信息,减少回溯。I可以不回溯,模式向右滑动到新的比较点k,并且k仅与模式串T有关。显然,关键问题是如何确定位置k?这里我们要提到有关前缀的知识。模式T=”t1t2…tm”中的每一个字符Tj都对应一个k值,这个k值仅依赖于模式本身字符序列的构成,而与主串无关。用next[j]表示Tj对应的k 值(1=j=m),则T1….Tk-1既是T1…Tj-1的真前缀又是T1…Tj-1的真后缀的最长子串,经分析知,k等于串t1t2……ti-1的既是真前缀又是真后缀的最长字串加1。 Next数组定义如下: Next[j]=1 j=1 Next[j]=max{k|1=kj且t1t2…..tk-1=tj-k+1tj-k+2…..tj-1} Next[j]=1 其他情况 KMP算法中求next数组 Void GetNext(char T[],int next[]) { Next[1]=0; J=1;k=0; While(jT[0]) If((k==0)||T[j]==T[k])){ J++; K++; Next[j]=k; } Else k=next[k]; } KMP算法的伪代码描述 在串S和串T中分别设比较的起始下标i和j; 循环直到S中所剩字符长度小于T的长度或T中所有字符均比较完毕 2.1如果S[i]=T[j],则继续比较S和T的下一个字符;否则 2.2将j向右滑动到next[j]位置,即j=next[j]; 2.3如果j=0,则将i和j分别加1,准备下一趟比较; 3.如果T中所有字符均比较完毕,则返回匹配的起始下标,否则返回0; BM算法 BM算法与KMP算法的区别是匹配操作的方向不同。虽然BM算法仅把匹配操作的字符比较次序改为从右至左,但匹配发生失败时,模式T右移的计算方法却发生了较大变化。 函数dist定义如下: Dist(c)=m-j j=max{j|tj=c且1=j=m-1} Dist(c)=m 若c 不出现在模式中或tm=c BM算法的基本思想:假设将主串中自位置i起往左的一个子串与模式进行从右到左的匹配过程中,若发现不匹配,则下次应从主串的i+dist(Si)位置开始重新进行新一轮匹配,其效果相当于把模式和主串均向右滑过一段距离dist(Si),即跳过dist(Si)个字符而无需进行比较。 Dist(c) 函数的C++描述: voi

文档评论(0)

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

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

1亿VIP精品文档

相关文档