标签:
■Boyer-Moore(BM)算法
开发于1977年的Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法,后缀匹配就是模式串从右到左开始比较,但模式串的移动还是从左到右的。为了实现更快的移动模式串,BM定义了两个规则:坏字符规则和好后缀规则
坏字符(不匹配的字符)规则
1、如果坏字符c没有出现在模式串P中,则直接将模式串P移动到坏字符c的下一个字符。
2、如果坏字符c出现在模式串P中,则将模式串P最靠近好后缀的坏字符(当然这个实现就有点繁琐)与母串的坏字符对齐:
好后缀(所有尾部匹配的字符串)规则
1、模式串中有子串匹配上好后缀,此时移动模式串,让该子串和好后缀对齐即可,如果超过一个子串匹配上好后缀,则选择最靠靠近好后缀的子串对齐。
2、模式串中没有子串匹配上后后缀,此时需要寻找模式串的一个最长前缀,并让该前缀等于好后缀的后缀,寻找到该前缀后,让该前缀和好后缀对齐即可。
其实,1和2都可以看成模式串还含有好后缀串(好后缀子串也是好后缀)。
3、模式串中没有子串匹配上后后缀,并且在模式串中找不到最长前缀,让该前缀等于好后缀的后缀。此时,直接移动模式到好后缀的下一个字符。
这两个规则分别计算我们能够向后移动模式串长度,然后选取这两个规则中移动大的,作为我们真正移动的距离。
算法的时间复杂度最差是O(mn),最好是O(n/m),其中n为母串的长度,m为模式串的长度。
用java实现的代码。
http://www.oschina.net/code/snippet_660460_48329
标签:
原文地址:http://my.oschina.net/u/660460/blog/420739