多模式匹配算法
AC自動機中,轉(zhuǎn)移的最小單位是一個字符。也就是說,匹配后只能移動一個字符,復(fù)雜度是線性的O(n)
。然而線性并非最快,Boyer-Moore算法在匹配后可以跳過多個字符,比線性還快。據(jù)說在實踐中,利用Boyer-Moore優(yōu)化的AC自動機總是更快。
來熟悉一下Boyer-Moore算法的基本思路。假設(shè)模式串的長度為m
,母文本為t。算法不是去母文本中找模式串,而是在模式串中從右到左找文本的第 m個字符tm。如果沒找到,那么就可以在母文本中跳過m個字符,繼續(xù)搜索t2m。如果找到了,比如說是模式串的第2個字符,那就可以跳過m?2個字符,繼續(xù)搜索t2m?2,以此類推。ti恰好與模式串尾部匹配的時候,再比較剩下的ti?1?tt?m,直到這m個字符都匹配上。該算法可利用下圖演示(二進(jìn)制串匹配,白色代表0,綠色代表1
):
上例在匹配下標(biāo)5
后直接快進(jìn)了3
個字符。
Wu Manber利用了Boyer-Moore的思路,將該算法拓展到多模式匹配。
預(yù)處理
第一步要算出所有模式串上的最小長度m
,然后先考慮每個模式串的前m個字符。如此所有模式串長度都一樣了。注意如果最短模式串非常短,比如長度為1,
總結(jié)
- 上一篇: Java 中的位移运算符
- 下一篇: 华丽地处理字符串