1. WM(Wu-Manber)算法的簡單理解:
(1)WM算法需要的參數:
∑:字母集
c: 字母集數目
m:模式串集合中,字符串長度最小的模式串的長度
B:字符塊長度,是shift表的索引,一般取2或者3
h:當前掃描過程中長度為B的模式串子串
T:文本串
N:文本串總長度
P={P1, P2....Pk}:模式串集合
k:模式串的數目
C:前綴長度(PREFIX表使用)
(2)WM算法的時間復雜度:
O(BN/kM),由此可以看出,WM使用於大規模的模式串集合且模式串集合中最小長度較大的場景!
(3)WM算法的核心思想:
WM算法是對BM算法的延伸繼承,用BM算法的核心框架,用字符塊來計算shift表(取代壞字符表)進行跳轉,在進行匹配時,用hash和prefix計算前后綴的hash值來從眾多可選的模式串中快速篩選出正確匹配的模式串。
(4)WM算法的三張核心表:
shift表:用於記錄文本串向右移動的長度,即一張跳轉表(
ps:有點類似BM算法的壞字符表,不過BM是針對單字符,WM是針對字符塊)。
hash表:hash表記錄了所有模式串后綴(長度為B)與模式串本身的映射關系。當shift[h]=0時,B與對應模式串P的映射關系,但是存在一對多的映射,因為模式串集合中存在相同后綴的模式串,所以hash表的value應該是一個鏈表的形式,存儲多個模式串(
ps:當shift[h]=0時,說明匹配到了某模式串,此時要用hash表查匹配到了哪個模式串P)
prefix表:prefix記錄了所有模式串前綴(長度為B)與模式串本身的映射關系。同hash表一樣,B與對應模式串P的映射關系存在一對多,所以prefix表的value也是一個鏈表的形式,存儲多個模式串。(
ps:hash與prefix兩個表取交集極大地縮小了需要匹配的次數)
2. WM(Wu-Manber)算法的匹配過程:
當B個字符構成的子串h在模式串集合中沒有匹配,即shift[h]<0,則跳轉的距離是:m-B+1(相對保守的策略)
當B個字符構成的子串h在模式串集合中有匹配且非后綴,即shift[h]>0,則跳轉的距離是:shift[h](相對安全的滑動)
當B個字符構成的子串h在模式串集合中且是后綴,即shift[h]=0,則查hash和prefix表確定匹配到了哪個模式串
3. WM(Wu-Manber)算法的簡單例子(來自joylnwang專欄-WM算法詳解):
目標串target[1...10]=dcbacabcde,模式結合P={abcde,bcbde,abcabe}(ps:m=5,B=2,k=3,C=2),預處理后得到的三張表如下所示:
WM算法的匹配過程是:
(1)從i=5(因為m=5)開始執行算法,首先我們發現target[4...5] = ac(target[i-B+1](5-2+1)
),SHIFT表中不存在ac,所以i = i+4 (shift表中
沒找到,則 i +=
m-B+1
)
(2)此時i=9,發現target[8...9]=cd,查SHIFT[cd]=1,所以i +=
SHIFT[cd]。
(3)此時i=10,然后發現target[9...10]=de, 查SHIFT[de]=0,表明可能出現匹配到模式串的情況。
(4)查HASH[de]有兩個模式串abcde和bcbde;在target中取長度為C的從i-m+1開始的子串,即target[6...7] = ab,查PREFIX[ab] = abcde。此時確定模式串是abcde。
4. WM(Wu-Manber)算法的程序實例:
