BM算法详解及Java实现.docxVIP

  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文档。上传文档
查看更多
BM算法详解及Java实现 1977年,德克萨斯大学的 Robert S. Boyer教授和J Strother Moore教授发明了一种新的 字符串匹配算法:Boyer-Moore算法,简称BM算法。该算法从模式串的尾部开始匹配,且 拥有在最坏情况下 0(N)的时间复杂度。在实践中,比 KMP算法的实际效能高。 后缀暴力匹配算法 后缀匹配,是指模式串的比较从右到左, 的BM算法其实是对后缀暴力匹配算法的改进。 始。下面直接给出伪代码,注意这一行代码: 模式串的移动也是从左到右的匹配过程, 经典 所以还是先从最简单的后缀暴力匹配算法开 j++; BM算法所做的唯一的事情就是改进了这 行代码,即模式串不是每次移动一步, 而是根据已经匹配的后缀信息, 从而移动更多的距离。 *后缀暴力匹配 @paramT正文字符数组 @paramP模式字符数组 @return 匹配位置 */ public static int bf( char [] T, char [] P) { for (in t j = 0; j = T. len gth - P. le ngth ; j ++) { int i = P. length - 1; for (; i = 0 F[ i ] == T[i + j ]; -- i ) { } if ( i 0) { return j ; } } return -1; } BM算法介绍 为了实现更快移动模式串, BM算法定义了两个规则,好后缀规则和坏字符规则,如下 图可以清晰的看出他们的含义。 利用好后缀和坏字符可以大大加快模式串的移动距离, 不是 简单的++j,而是j+=max (shift(好后缀),shift(坏字符))。 1 — a b a b a b a a b a b a c a b a 好* F面举例说明 BM算法。例如,给定文本串 “HERES A SIMPLE EXAMPL”,和模式串 “ EXAMPLE现要查找模式串是否在文本串中,如果存在,返回模式串在文本串中的位置。 首先,文本串与模式串头部对齐,从尾部开始比较。S与E不匹配。这时,S就被称为坏字符(bad character),即不匹配的字符,它对应着模式串的第 6位。且S不包含在模式串EXAMPLE之中(相当于最右 出现位置是-1),这意味着可以把模式串后移 6-(-1)=7位,从而直接移到S的后一位。 HEREEX AMPSIMPLEEXAMPLE HERE EX AMP SIMPLE EXAMPLE 依然从尾部开始比较,发现P与E不匹配,所以P是坏字符”。但是,”P包含在模式串EXAMPLE之中。因为 “P这个坏字符”对应着模式串的第6位(从0开始编号),且在模式串中的最右出现位置为 4,所以,将模式串 后移6-4=2位,两个P对齐。 HERE I S A S IMlplLE EXAMPLE exampl|e| HERE I S A S IMlplLE EXAMPLE EXAMPLE 依次比较,得到 “MPLE匹配,称为”好后缀(good suffix ),即所有尾部匹配的字符串。注意,MPLE、PLE、 LE、”E 都是好后缀。 HEREA SDMPLEEXAMPLE HERE A SDMPLE EXAMPLE EXAMPLE 发现“与“A”匹配:“是坏字符。如果是根据坏字符规则,此时模式串应该后移 2-(-1)=3位。 HERE I S A s[i|mPLE EXAMPLE e^|a|mple HERE I S A S iImIpLE EXAMPLE IeJxample 继续从尾部开始比较,X”与“E不匹配,因此次”是好字符”,根据 好字符规则”,后移6 - 1 = 5位。这是,“ X” 与“ X ”对齐。 HEREISASIMPLEEXAMPMPLEHEREIS A SIMPLEMPLEMPLE HERE ISA SIMPLE EXAMP MPLE HERE IS A SIMPLE MPLE MPLE 依次从尾部开始比较,所有字段都能匹配,查找成功。 HERE IS A SIMPLE EXAMPLE EXAMPLE 由上可知,BM算法不仅效率高,而且构思巧妙,容易理解。 三、坏字符算法 先来看如何根据坏字符来移动模式串,(1) 坏字符没出现在模式串中,shift( 先来看如何根据坏字符来移动模式串, (1) 坏字符没出现在模式串中, 续比较,如下图: 文本串T ? c b a a b 0 i n-1 a b aba b a b a b a b a b a b 言全移动 (2) 坏字符出现在模式串中, 这时可以把模式串第一个出现的坏字符和母串的坏字 符对齐,当然,这样可能造成模式串倒退移动,如下图: 文本軍T ■ I I I I

文档评论(0)

尐丶丑 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档