第二章 相關工作
2.2 Wu-Manber 演算法
在 1994 年 5 月發表的"A fast algorithm for multi-pattern searching"為 Sun Wu 和 Udi Manber 兩位先生共同提出。此演算法採用的跳躍不可能匹配之字元與雜 湊陣列(Hash array)方式加速比對字樣的進行。
Wu-Manber 亦須對字樣集合內的所有字樣進行預先處理之動作,分別建構
第二章 相關工作
出 SHIFT 表(SHIFT table),HASH 表(HASH table),以及 PREFIX 表(PREFIX table) 等三個表。SHIFT 表用於指示當在掃描輸入字串時,根據所讀入之輸入字元串決 定可以跳躍的字元數(距離),如果所對應之值為 0,則表示可能產生匹配的情況,
這時我們須交由 HASH 表與 PREFIX 表更進一步的驗證判斷,以決定匹配了哪 些可能的字樣,再則驗證哪一個或哪些字樣完全匹配。
假設字樣集合中的最短字樣的長度為 m,則我們將取字樣集合內的每一個字 樣前 m 個字元(每一個字樣等長)進行多字樣比對,這樣的動作是為了增進比對之 速度與簡單性(不必去在意各字樣的長度,因為已將每一個字樣取等長)。
令 為輸入字元串中的待比對之區塊字串。區塊字串 X 將透過雜
湊函數映射得到一雜湊值,並將此雜湊值作為 SHIFT 表的一個索引值(index),
由 SHIFT 表得到的值將代表此區塊字串可跳躍(移動)的位元組數。
1 2... B X =x x x
1 X does not appear as a substring in any pattern of P [ ] X appears in some patterns
m B SHIFT i
m q
⎧ − +
= ⎨⎩ −
如上述方程式所示,我們經 X 得到一雜湊值為 i 所可移動的式子將分為兩大類。
第一類,X 不屬於字樣集合內的一個字樣;第二類,X 可能出現於多個字樣之中。
如圖-2.7~圖-2.8 所示,我們將舉一個例子說明 SHIFT[i]第一類的移動情況。
現在區塊字串 X 為『agc』,並且在字樣集合內存在了兩個字樣,分別為 p1與 p2。 從圖-2.7 所示,我們可以看到區塊字串 X 並不屬於 p1與 p2,因此可移動距離為
,如圖-2.8 所示,下次的區塊字串 X 將為『rbc』。
1 7 3 1 5 m b− + = − + =
圖-2.7:SHIFT[i]第一類的移動說明-1
第二章 相關工作
圖-2.8:SHIFT[i]第一類的移動說明-2
如圖-2.9~圖-2.12 所示,我們將舉一個例子說明 SHIFT[i]第二類的移動情 況。現在區塊字串 X 為『agc』,並且在字樣集合內存在了兩個字樣,分別為 p1
與 p2。從圖-2.9~圖-2.10 所示,我們可以看到區塊字串 X 同時存在於 p1與 p2,因 此可移動距離為 ,其中 q 為區塊字串 X 結束於 p1與 p2的最大的位置。如 圖-2.11 所示,區塊字串 X 的最後一個字元結束的位置為 p1的第 3 的字元,而區 塊字串 X 的最後一個字元結束的位置為 p2的第 5 的字元。因此,我們的 q 值將 選擇 5,可移動距離將為 ,如圖-2.12 所示,下次的區塊字串 X 將 為『cxv』。
m−q
7 5 2 m q− = − =
圖-2.9:SHIFT[i]第二類的移動說明-1
圖-2.10:SHIFT[i]第二類的移動說明-2
第二章 相關工作
圖-2.11:SHIFT[i]第二類的移動說明-3
圖-2.12:SHIFT[i]第二類的移動說明-4
假設現在正比對的區塊字串 X 的雜湊值 h,如果 SHIFT[h]=0,則表示可能 產 生 的 匹 配 , 因 此 我 們 須 進 一 步 地 利 用 此 雜 湊 值 h 去 查 詢 HASH 表 , HASH[h]=p,其中 p 將作為字樣鏈表(pattern list)與 PREFIX 表的一個指示值。字 樣鏈表儲存的是後 B 個字元的雜湊值與區塊字串 X 的雜湊值 h 一樣的字樣;
PREFIX 表則儲存的是這些字樣的前 B 個字元的雜湊值,這樣的作法將有利於減 少比對的次數,因為僅當這些字樣的前 B 個字元的雜湊值和後 B 個字元的雜湊 值與輸入字串的前 B 個字元的雜湊值和後 B 個字元的雜湊值一樣時我們才需進 行一個一個位元組的詳細比對。