WM演算法詳解

2021-06-05 11:55:33 字數 1832 閱讀 2830

提到多模式匹配演算法,就得說一下wu-manber演算法,其在多模式匹配領域相較於aho-corasick演算法,就好象在單模式匹配演算法中bm演算法相較於kmp演算法一樣,在絕大多數場合,wu-manber演算法的匹配效率要好於aho-corasick演算法。這個演算法是由吳昇(台灣)和他的導師udi manber在九十年代提出。當然,要想充分理解wm演算法如何加快多模式匹配的效率,還需要對bm演算法的深刻了解,可以參考我的另一篇文章《bm演算法詳解》。

在bm演算法中引入的壞字元跳轉概念,是bm演算法能夠在一般應用場景中,效率高於kmp演算法的主要原因。wm演算法在多模式匹配中,也引入了類似的概念,從而實現了模式匹配中的大幅度跳轉。但是在單模式應用場景,很少有哪個模式串會包含所有可能的輸入字元,而在多模式匹配場景,如果模式集合的規模較大的話,很可能會覆蓋很大一部分輸入字元,導致壞字元跳轉沒有用武之地。所以wm演算法中使用的壞字元跳轉,不是指乙個字元,而是乙個字元塊,或者說幾個連續的字元。通過字元快的引入,擴大了字元範圍,使得實現壞字元跳轉的可能性大大增加。

wm演算法一般由三個表構成,shift,hash,prefix。

shift表就相當於bm演算法中的壞字元表,其構建過程有如下幾點需要關注

hash表就是對應字元塊b,所有shift[b]=0的模式與b的對映關係。比如模式串abcde,bcbde,對於塊de,他們的shift值都是0,所以他們都由de索引。

實際上,在wm演算法中,是可以沒有prefix表的,但是對於字母文字來說,可能存在多個模式由乙個字元塊共同索引的情況,如上例,如果存在10個最末兩個字元為de的模式串的話,那麼在目標串中檢索出de組合之後,要用當前的子串逐個嘗試匹配這10個模式串,對於演算法效率影響很大。所以wm演算法同時擷取了模式串的乙個長度為2或者3的字首,構建prefix表。在執行中綴查詢的基礎之上,再執行字首查詢,縮小備選模式集,提高匹配效率。如上例,abcde,bcbde,有共同的字元塊de,使得shift[de]=0,如果沒有prefix表,就需要將游標向前移動5位,然後逐一嘗試匹配這兩個備選模式,如果有了prefix表,我們就可以用兩個模式的字首ab,bc再執行一次索引,一般情況下shift值相同,prefix也相同的模式串比例很小,本例中二者的字首是不同的,索引之後就只剩下乙個備選模式,此時執行一次字串比較即可判斷當前位置是否發現了匹配模式。

下面用圖來描述一下wm演算法所要維護的資料結構:

wm演算法執行模式匹配的流程如下。

對於目標串target,游標i,模式字首長度m,字元快長度b,字首長度c。我們取target[i-b+1...i],查詢其在shift表中的對應值shift[target[i-b+1...i]],如果找不到,則i+=m-b+1,如果其值為c(c != 0),那麼我們i+=c,再執行上述操作。如果其shift值等於0,我們需要取出target[i-m+1...i-m+c],然後在shift[de]=0對應prefix結合中查詢prefix[target[i-m+1...i-m+c]],如果不存在,則將游標i+=1。如果存在則用target[i-m+1]開始的子串,依次匹配滿足條件的所有模式串,直到找到匹配模式,或者未發現匹配位置。然後i+=1,繼續向後查詢。

下面以wm演算法對目標串target[1...10]=dcbacabcde,模式結合p,的匹配過程來形象的說明一下。首先,對於模式集合p預處理之後的結果如上面的程式結構圖所示。然後從i=5開始執行演算法。首先我們發現target[4...5] = ac,shift表中不存在ac,所以i+4,到target[9],此時發現target[8...9]=cd,shift[cd]=1,所以i+1,然後發現target[9...10]=0,我們取target[6...7]=ab,發現prefix[ab]對應的模式串是abcde,然後我們從target[6]開始用目標串與模式串比較,發現匹配模式abcde。

後繼:既然wm演算法也是堪稱經典的多模式匹配演算法,就不能迴避與ac演算法的比較。

wm螢幕校準

wince的cordll提供了螢幕校準的函式,使用方法與鉤子函式類似,強制載入dll,獲取位址,然後用函式指標呼叫。typedef bool winapi touchcalibrate hinstance hinstance loadlibrary t coredll.dll if hinstanc...

WM 實現透明效果

一 使用alphablend api 這個可以看黎老師的文章。見原文 net framework的winform程式支援支援調節控制項的透明度和gdi 用它可以實現例如淡入淡出這種很酷的介面效果。而.net compact framework的窗體和控制項不支援透明和gdi 因此常常利用來完成一些美...

WM操作記錄1

第一種情況 先建轉儲單,再收貨。第二種情況 先收貨,再建轉儲單。無論哪一種情況,都是在做內向交貨單收貨時,im庫存數量才會增加。內向交貨單是否需要上架 putaway 是由專案類別zeln決定。logistics execution shipping deliveries define item c...