淺談WM算法


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)算法的程序實例:
  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM