多模式匹配算法

AC自动机中,转移的最小单位是一个字符。也就是说,匹配后只能移动一个字符,复杂度是线性的O(n)

。然而线性并非最快,Boyer-Moore算法在匹配后可以跳过多个字符,比线性还快。据说在实践中,利用Boyer-Moore优化的AC自动机总是更快。

来熟悉一下Boyer-Moore算法的基本思路。假设模式串的长度为m

,母文本为t。算法不是去母文本中找模式串,而是在模式串中从右到左找文本的第 m个字符tm。如果没找到,那么就可以在母文本中跳过m个字符,继续搜索t2m。如果找到了,比如说是模式串的第2个字符,那就可以跳过m−2个字符,继续搜索t2m−2,以此类推。ti恰好与模式串尾部匹配的时候,再比较剩下的ti−1⋯tt−m,直到这m个字符都匹配上。该算法可利用下图演示(二进制串匹配,白色代表0,绿色代表1

):

Boyer - Moore.png

上例在匹配下标5

后直接快进了3

个字符。

Wu Manber利用了Boyer-Moore的思路,将该算法拓展到多模式匹配。

预处理

第一步要算出所有模式串上的最小长度m

,然后先考虑每个模式串的前m个字符。如此所有模式串长度都一样了。注意如果最短模式串非常短,比如长度为1,则算法不可能跳过2

及以上个字符,效率变低。

如果每次比较不局限于1

个字符,而是比较B个字符,则比较次数可以减小到1B。同时每次在模式串位置i匹配上了之后可以跳过的字符数减小到m−i−B+1,都不匹配时i=0

SHIFT表的构造

猜你喜欢

转载自blog.csdn.net/zhangchen124/article/details/105133521