摘要
BM(Boyer-Moore)算法是单模式匹配的字符串搜索算法,相对经典的KMP字符串匹配算法,效率更好。在模式串长度大的时候效率更高。算法需要对模式串进行预处理,处理过后,在搜索过程中就可以最大减少字符比较次数,以此提高效率。BM算法主要三个特点:从模式串最右开始进行匹配;坏字符表;好后缀表。基本思路就是从右往左进行字符匹配,遇到不匹配的字符后从坏字符表和好后缀表找一个最大的右移值,将模式串右移继续匹配。
1 坏字符
右移位数 = 坏字符出现的位置 – 坏字符在模式串中上一次出现的位置
如果字符在模式串中没有出现,则认为上一次出现的位置为-1。-1意思是啥呢?就是右移之后模式串首部与坏字符出现的后一个字符对齐。
对于模式串EXAMPLE,计算字母P的右移位数 : P的位置为5,上一次出现的位置是-1(没有出现),则右移位数为:5- (-1)= 6,对于模式串中最后出现的 。
i |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
|
Pat[i] |
E |
X |
A |
M |
P |
L |
E |
-pat[i] |
BmBC[i] |
1-> 6 |
2 |
3 |
4 |
5 |
6 |
6 |
7 |
代码如下:
|
1 |
void preBmBC(char *pat, int m, int BmBC[]) |
2 |
{ |
3 |
int i; |
4 |
for (i = 0; i < ASIZE; ++i) |
5 |
BmBC[i] = m; |
6 |
for (i = 0; i <= m - 1; ++i) |
7 |
BmBC[pat[i]] = m - i - 1; |
8 |
return; |
9 |