码迷,mamicode.com
首页 > 编程语言 > 详细

模式匹配- BM算法

时间:2015-05-27 21:19:04      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

Boyer-MooreBM)算法

开发于1977年的Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法,后缀匹配就是模式串从右到左开始比较,但模式串的移动还是从左到右的。为了实现更快的移动模式串,BM定义了两个规则:坏字符规则和好后缀规则

 

坏字符(不匹配的字符)规则

1、如果坏字符c没有出现在模式串P中,则直接将模式串P移动到坏字符c的下一个字符。

2、如果坏字符c出现在模式串P中,则将模式串P最靠近好后缀的坏字符(当然这个实现就有点繁琐)与母串的坏字符对齐:

 

 

好后缀(所有尾部匹配的字符串)规则

1、模式串中有子串匹配上好后缀,此时移动模式串,让该子串和好后缀对齐即可,如果超过一个子串匹配上好后缀,则选择最靠靠近好后缀的子串对齐。

2、模式串中没有子串匹配上后后缀,此时需要寻找模式串的一个最长前缀,并让该前缀等于好后缀的后缀,寻找到该前缀后,让该前缀和好后缀对齐即可。

其实,12都可以看成模式串还含有好后缀串(好后缀子串也是好后缀)。

3、模式串中没有子串匹配上后后缀,并且在模式串中找不到最长前缀,让该前缀等于好后缀的后缀。此时,直接移动模式到好后缀的下一个字符。

 

这两个规则分别计算我们能够向后移动模式串长度,然后选取这两个规则中移动大的,作为我们真正移动的距离。

 

算法的时间复杂度最差是O(mn),最好是O(n/m),其中n为母串的长度,m为模式串的长度。

 

java实现的代码。

 

http://www.oschina.net/code/snippet_660460_48329

 


模式匹配- BM算法

标签:

原文地址:http://my.oschina.net/u/660460/blog/420739

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!