BM模式匹配演算法原理(圖解)
BM模式匹配演算法原理(圖解)
首先,先簡單說明一下有關BM演算法的一些基本概念。
BM演算法是一種精確字串匹配演算法(區別於模糊匹配)。
BM演算法採用從右向左比較 的方法,同時應用到了兩種啟發式規則,即壞字元規則 和好字尾規則 ,來決定向右跳躍的距離。
BM演算法的基本流程: 設文字串T,模式串為P。首先將T與P進行左對齊,然後進行從右向左比較 ,如下圖所示:
若是某趟比較不匹配時,BM演算法就採用兩條啟發式規則,即壞字元規則 和好字尾規則 ,來計算模式串向右移動的距離,直到整個匹配過程的結束。
下面,來詳細介紹一下壞字元規則 和好字尾規則 。
首先,詮釋一下壞字元和好字尾的概念。
請看下圖:
圖中,第一個不匹配的字元(紅色部分)為壞字元,已匹配部分(綠色)為好字尾。
1)壞字元規則(Bad Character):
在BM演算法從右向左掃描的過程中,若發現某個字元x不匹配,則按如下兩種情況討論:
i. 如果字元x在模式P中沒有出現,那麼從字元x開始的m個文字顯然不可能與P匹配成功,直接全部跳過該區域即可。
ii. 如果x在模式P中出現,則以該字元進行對齊。
用數學公式表示,設Skip(x)為P右移的距離,m為模式串P的長度,max(x)為字元x在P中最右位置。
例1:
下圖紅色部分,發生了一次不匹配。
計算移動距離Skip(c) = 5 - 3 = 2,則P向右移動2位。
移動後如下圖:
2)好字尾規則(Good Suffix):
若發現某個字元不匹配的同時,已有部分字元匹配成功,則按如下兩種情況討論:
i. 如果在P中位置t處已匹配部分P'在P中的某位置t'也出現,且位置t'的前一個字元與位置t的前一個字元不相同,則將P右移使t'對應t方才的所在的位置。
ii. 如果在P中任何位置已匹配部分P'都沒有再出現,則找到與P'的字尾P''相同的P的最長字首x,向右移動P,使x對應方才P''字尾所在的位置。
用數學公式表示,設Shift(j)為P右移的距離,m為模式串P的長度,j 為當前所匹配的字元位置,s為t'與t的距離(以上情況i)或者x與P''的距離(以上情況ii)。
以上過程有點抽象,所以我們繼續圖解。
例2:
下圖中,已匹配部分cab(綠色)在P中再沒出現。
再看下圖,其後綴T'(藍色)與P中字首P'(紅色)匹配,則將P'移動到T'的位置。
移動後如下圖:
自此,兩個規則講解完畢。
在BM演算法匹配的過程中,取SKip(x)與Shift(j)中的較大者作為跳躍的距離。
BM演算法預處理時間複雜度為O(m+s),空間複雜度為O(s),s是與P, T相關的有限字符集長度,搜尋階段時間複雜度為O(m·n)。
最好情況下的時間複雜度為O(n/m),最壞情況下時間