KMP算法研究与实现.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文档。上传文档
查看更多
KMP算法研究与实现.doc

KMP算法研究与实现   摘要:文字是传播信息的关键载体之一,是表达人类情感的重要方式,更是传承文化的最关键最基本的手段。理所当然,文本编辑程序是计算机中最重要的应用之一。自从计算机被发明以来,字符,字符串,文本,就一直于人类打着交道。在文本编辑程序中,经常会出现要搜索一段特定文字以及对其位置定位的情况,当文本内容庞大,或者要搜索的内容出现相当频繁时,良好的搜索算法对效率的提高就相当可观了。该文研究了效率极高的KMP字符串匹配算法,并使用C语言对算法进行了实现。   关键词:查找搜索;字符串匹配;KMP算法   中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)20-4696-03   文本,一直是计算机这一领域中最基本的元素,无论是计算机刚诞生的年代,还是如今多媒体技术绚烂夺目的时代,文本一直都作为奠基性质的元老角色而存在着。   在对文本的编辑中,会遇到需要查找匹配特定模式的情况。比如,在一个文本文件中查找“ABC”这一小段,或者查找“不知道”这一词语。当文本的内容比较少时,人们可以通过简单的逐行查找来找到匹配的特定模式,然而,当文本具备一定的规模后,在其中查找特定的模式就足以令人抓狂了。   在当下这个信息大爆炸的时代,拥有大规模内容的文本实在不在少数,无论是金融界、文学界、政界还是计算机专业界,每天面对大量的文字信息实在令人欲罢不能,在其中寻找重要的关键词、关键句或者关键段落时,更是令人痛不欲生,即使是交给计算机去做,也需耗费大量的开销。因此,设计出一种好的算法,以高效地查找大容量文本文件中的特定匹配模式,不仅可以大大提高文本编辑的响应性能,还能改善人类的生活。   此外,随着学科之间交叉性的提高,很多领域也需要在大量的信息中查找某些特定模式及其出现的位置,例如DNA测序定位、海洋数据查询、高效搜索引擎等。   幸运的是,目前已经有了高效的字符串匹配算法,并且,此类算法仍在不断发展进化,向着更高的效率进发。   在本文中,作者研究分析了效率高超的KMP字符串匹配算法,并使用C语言对其进行了实现。   1 KMP算法研究与分析   历史上人们通过对字符串的研究而得出的字符串匹配问题的算法很多,其中很重要的一类匹配算法分为两步:第一步先对要匹配的模式进行一些预处理,第二步再寻找模式在全文本中的所有有效位移(即匹配)。KMP算法即是其中最高效的算法之一。   KMP字符串匹配算法,是由Knuth、Morris和Pratt三人设计的线性时间字符串匹配算法。假设要搜寻的模式有m个字符单位,整个文本有n个字符单位(一般来说n m),则KMP算法所用时间花销在n+m这个数量级上,比起很多其他的算法要快不少。   KPM算法简单来说,可以从以下的事实获得灵感:对于在文本中搜寻特殊模式的情形来说,文本所包含的的信息毫无疑问比起特定模式要多得多,其不确定信息也更多。比如,在很长的文本中,下一个出现的字符可能是任何字符,变化可能会很大,然而,对于较短的确定的特定模式来说,在模式中出现的字符却基本上是确定的,因为模式是特别选出的,而且模式比起文本要短得多。一个最常见的例子就是在谷歌中搜寻“平板电脑”这一关键词,很明显,我们对“平板电脑”这四个字中所包含的信息可以说几乎完全确定,而对于在互联网中会出现什么样的网站能匹配这次搜索却包含着极大的不确定性。   因此,可以先对特定模式进行分析,得出所需要的信息,从而利用这些信息来加快匹配速度。   KMP的核心思想,便是充分利用特定模式本身所包含的信息,通过对特定模式的预处理而得出一个前缀函数,从而能够在对文本的匹配搜索中避免一般搜索所花费的无用功。   首先,让我们来看一下什么是前缀函数。   一个字符串的前缀相信不难理解,比如“abc”的前缀可以是“a”也可以是“ab”。在这里,前缀都指的是严格意义上的前缀,比如在刚刚的例子中,“abc”就不是字符串“abc”的前缀。   KMP的前缀函数则是包含有模式与其自身的位移进行匹配的信息的函数。通过前缀函数的生成,我们可以获得特定模式中以每一位字符所引领的前缀匹配原来特定模式的位移,并且通过这个位移,我们可以充分利用特定模式中先前已经与文本比较过的前缀所包含的信息,从而能快速准确地递归得出下一个最大匹配字符数。   以上的描述可以通过以下这个简单的例子来说明:   假设我们的特定模式为“abcabcde”,可以看出,若此模式在搜索匹配时,已经有“abcabc”与文本中的信息匹配上了,却在其后一位不匹配,此时,我们可以充分利用其本身所包含的信息,即“abc”这一前缀可以匹配“abcabc”的后三位,因此,我们可以立即将原模式“abcabcde”在此时文本中进行匹配的位置向文本结

文档评论(0)

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

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

1亿VIP精品文档

相关文档