KMP模式匹配算法探讨.docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
KMP模式匹配算法探讨.doc

KMP模式匹配算法探讨 摘 要 介绍了KMP算法并与朴素查找算法进行了比较,提出了前缀函数的概念,并利用改进的前缀函数改进KMP算法,最后结合KMP的改进算法给出了多次匹配的算法。 关键词 串匹配,前缀函数,KMP算法 在计算机科学领域,串的模式匹配(以下简称为串匹配)算法一直都是研究焦点之一。在拼写检查、语言翻译、数据压缩、搜索引擎、网络入侵检测、计算机病毒特征码匹配以及DNA序列匹配等应用中,都需要进行串匹配。串匹配就是在主串中查找模式串的一个或所有出现。在本文中主串表示为S=s1s2s3…sn,模式串表示为T=t1t2…tm。串匹配从方式上可分为精确匹配、模糊匹配、并行匹配等,著名的匹配算法有BF算法、KMP算法、BM算法及一些改进算法。本文主要在精确匹配方面对KMP算法进行了讨论并对它做一些改进以及利用改进的KMP来实现多次模式匹配。 1 KMP算法 最简单的朴素串匹配算法(BF算法)是从主串的第一个字符和模式串的第一个字符进行比较,若相等则继续逐个比较后续字符,否则从主串的第二个字符起再重新和模式串的第一个字符进行比较。依次类推,直至模式串和主串中的一个子串相等,此时称为匹配成功,否则称为匹配失败。朴素模式匹配算法匹配失败重新比较时只能向前移一个字符,若主串中存在和模式串只有部分匹配的多个子串,匹配指针将多次回溯,而回溯次数越多算法的效率越低,它的时间复杂度一般情况下为O((n-m+1)m) (注:n和m分别为主串和模式串的长度),最坏的情况下为O(m*n),最好的情况下为O(m+n)。KMP模式匹配算法正是针对上述算法的不足做了实质性的改进。其基本思想是:当一趟匹配过程中出现失配时,不需回溯主串,而是充分利用已经得到的部分匹配所隐含的若干个字符,过滤掉那些多余的比较,将模式串向右“滑动”尽可能远的一段距离后,继续进行比较,从而提高模式匹配的效率,该算法的时间复杂度为O(m+n)。 那么如何确定哪些是多余的比较? 在KMP算法中通过引入前缀函数f(x)来确定每次匹配不需要比较的字符,保证了匹配始终向前进行,无须回溯。假设主串为s1s2,sn.,模式串为t1t2,tm.,其中 m≦n,从si+1开始的子串遇到一个不完全的匹配,使得: (1.1) 如果我们能确定一个最小的整数 ,使得: (1.2) 其中 ,所以确定i 等价于确定k,这里的k值就是我们要求的前缀函数f(x)。由式1.1和1.2中K值与主串s无关,只与给定的模式串t中与主串匹配的q有关,即k=f(q), f(q)=max{i|0 i q且t[1..i]是t[1..q]的后缀} (1.3) 确定KMP前缀函数的算法如下 : #define MAXSIZE 100 Typedef unsigned char string[MAXSIZE+1];//0号单元用来存放串的长度 void f(sstring t, int *array) { m=t[0];//m为当前模式串的长度 array=(int *)malloc((m+1)*sizeof(int));//0号元不用 array=0;k=0; for(q=2;qlt;=m;q++) {while(kgt;0amp;amp;t[k+1]!=t[q])k=array[k]; if(t[k+1]==t[q])k=k+1; array[q]=k; } } 关于KMP算法的前缀函数f(x)的示例见表1。 表1 模式串abaabcac I 1 2 3 4 5 6 7 8 Ti a b a a b c a c f(i) 0 0 1 1 2 0 1 0 当模式串中有i个字符串匹配成功,第i+1个字符不匹配时,则从i-f(i)个字符重新开始比较,这样不仅无须回溯,而且一次可以向前滑动i-f(i)个字符,大大提高了模式匹配的效率。下面给出朴素匹配算法和KMP匹配算法的比较,见表2。 表2 朴素匹配算法和KMP匹配算法比较表 朴素算法 KMP算法 时间复杂度 O((n-m+1)m) O(m+n) 向前移动字符个数 1 q-f(q) 回溯次数 q-1 无 其中:n为主串长度,m为模式串长度,q为匹配成功的字

文档评论(0)

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

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

1亿VIP精品文档

相关文档