模式匹配- BM算法

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

 


转载于:https://my.oschina.net/dubenju/blog/420739

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值