• 沒有找到結果。

第二章 相關工作

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』。

mq

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 個字元的雜湊值一樣時我們才需進 行一個一個位元組的詳細比對。

相關文件