轉載一篇關於字串匹配演算法ZZL的論文, 圖片有點問題,將就著看吧,這個演算法其實很簡單!就是先統計特徵串的首字元在主串中中的位置,然後每次匹配都是從儲存的位置開始。在平攤意義下,還是很有效果的。
字型大小:大
中
小
一種可做特殊用途的字串匹配演算法紀福全 朱戰立(西安石油大學電腦學院,西安 710065)
摘 要
現有的字串匹配演算法按照模式串從左至右或從右至左的順序匹配,都是直接進行比較,本文提出了一種可做特殊用途的字串匹配演算法——ZZL演算法。對於頻繁使用的要匹配的主串和模式串來說,ZZL演算法的匹配速度會非常快。
關鍵詞
字串,模式比對,演算法
字串匹配就是在一個字串中尋找模式串的一個或所有出現。字串匹配用途很廣泛。例如,在拼字檢查、語言翻譯、資料壓縮、搜尋引擎、網路入侵檢測、計算
機病毒碼碼匹配以及DNA序列匹配等應用中,都需要進行字串匹配。已經提出了許多字串匹配演算法。傳統的有BF演算法
[2,3]
、KMP演算法
[2,3]
等,最近提出的有BM演算法
[2,4]
、Sunday演算法
[2,3]
等。本文提出一種可做特殊用途的字串匹配演算法——ZZL演算法。
1
相關演算法分析 字串模式比對的含義是:在主串S中,從位置start開始尋找是否存在模式串(也稱作模式串)T,如在主串S中尋找到一個與模式串T相同的模式串,則模式串與主串匹配;如在主串S中未尋找到一個與模式串T相同的模式串,則不匹配
[1]
。首先作如下假設: 主串S:S[1…N],長度為N;模式串T:T[1…M],長度為M;N≥M;
1.1 BF
演算法
BF(Brute
Force)演算法核心思想是:首先S[1]和T[1]比較,若相等,則再比較S[2]和T[2],一直到T[M]為止;若S[1]和P[1]不等,則T向
右移動一個字元的位置,再依次進行比較。如果存在k,1≤k≤N,且S[k+1…k+M]=T[1…M],則匹配成功;否則失敗。該演算法最壞情況下要進行
M*(N-M+1)次比較,時間複雜度為O(M*N)。
1.2 KMP
演算法
KMP(Knuth-Morris-Pratt)演算法核心思想是:在發生失配時,主串不需要回溯,
而是利用已經得到的“部分匹配”結果將模式串右移儘可能遠的距離,繼續進行比較。這裡要強調的是,模式串不一定向右移動一個字元的位置,右移也不一定必須
從模式串起點處重新試匹配,即模式串一次可以右移多個字元的位置,右移後可以從模式串起點後的某處開始試匹配。 假設發生失配時,S[i]≠T[j],1≤i≤N,1≤j≤M。則下一輪比較時,S[i]應與T[
next
[
j
]]對齊往後比較:如T=“abaabcac”,則
1.3 BM
演算法
對於給出的長度為m的模式串T=T&&05;···Tm和主串S=S&&05;···Sn,實現BM演算法需要一個輔助數
組bm[
]。它用字元值作為數組的下標,數組的大小依賴於可能出現的字元多少,與模式串的大小無關。對於需要進行中文關鍵字的匹配,需要擴充ASCII字元集,數
組大小則為256。對於任意x屬於集合Σ→{1,2,···,256},bm[x]的值為: 該數組每個字元對應的項記錄著該字元在模式串中最後一次出現的位置。BM演算法思想是:假如在執行主串位置i起“返前”的一段與模式串T從右向左的字元匹配中,如果模式串T全部字元匹配,則匹配成功;否則需要右
移,開始新的一輪匹配,假設匹配不成功發生在模式串中的位置j,由主串匹配不成功字元Si-m+j尋找輔助數組得到該字元在模式串T中的最後出現的位置值
bm[Si-m+j]。如果bm[Si-m+j]等於零,表示字元Si-m+j不在模式串T中,則模式串跳過該字元,在該字元下一個位置對齊;如果
bm[Si-m+j]大於j,表示這個字元在模式串中最後出現的位置在j的左邊,則模式串T右移對齊字元Si-m+j;如果bm[Si-m+j]小於j,
表示這個字元在模式串中最後出現的位置在j的右邊,模式串不能左移,就右移一格。移動量為shift=max(1,m-bm[i-m+j])。
1.4 Sunday
演算法 Sunday演算法是Daniel
M.Sunday於1990年提出的一種比BM演算法搜尋速度更快的演算法。其核心思想是:在匹配過程中,模式串並不被要求一定要按從左向右進行比較還是從右
向左進行比較,它在發現不匹配時,演算法能跳過儘可能多的字元以進行下一步的匹配,從而提高了匹配效率。 假設在發生不匹配時S[i]≠T[j],1≤i≤N,1≤j≤M。此時已經匹配的部分為u,並假設字串u的長度為L。1。明顯的,S[L+i+1]肯定要參加下一輪的匹配,並且T[M]至少要移動到這個位置(即模式串T至少向右移動一個字元的位置)。
圖
1 Sunday
演算法不匹配的情況 分如下兩種情況: (1) S[L+i+1]在模式串T中沒有出現。這個時候模式串T[0]移動到S[T+i+1]之後的字元的位置。2。
圖
2 Sunday
演算法移動的第
1
種情況 (2)S[L+i+1]在模式串中出現。這裡S[L+i+1]從模式串T的右側,即按T[M-1]、
T[M-2]、…T[0]的次序尋找。如果發現S[L+i+1]和T中的某個字元相同,則記下這個位置,記為k,1≤k≤M,且
T[k]=S[L+i+1]。此時,應該把模式串T向右移動M-k個字元的位置,即移動到T[k]和S[L+i+1]對齊的位置。3。
圖
3 Sunday
演算法移動的第
2
種情況 依次類推,如果完全符合了,則匹配成功;否則,再進行下一輪的移動,直到主串S的最右端結束。該演算法最壞情況下的時間複雜度為O(N*M)。對於短模式串的匹配問題,該演算法執行速度較快。
2 ZZL
演算法 現有的字串匹配演算法不論是按照模式串從左至右還是從右至左的順序匹配,都是直接進行比較,而ZZL演算法
的核心思想是:首先在主串S中尋找模式串T的首字母,每找到一個則將它的位置儲存,然後依次提取這些位置,從這些位置開始繼續匹配模式串T。對於頻繁使用
的要匹配的主串和模式串來說,由於預先儲存了模式串在主串中的所有儲存位置,所以匹配速度會非常快。
2.1
預先處理
預先處理主要完成尋找模式串首字元在主串中的所有出現位置,並將其儲存在一個數組中。尋找模式串首字元演算法如下: k=0; for(i=start;i<S.length-T.length;i++) { if(S.str[i]==T.str[0]) { x[k]=i; k++; // k為模式串首字母在主串中出現的次數 } }
2.2
匹配
在預先處理的基礎上,字串匹配演算法就可以從尋找到的模式串在主串中的位置開始,匹配模式串首字母之後的其餘部分。此時,採用BF演算法即可,並可設定一個計數器,記錄匹配次數。 匹配演算法如下: v=0; for(m=0;m<k;m++) { for(j=1;j<T.length;j++) { if(S.str[x[m]+1]==T.str[j]) { v++; x[m]++; } else { v++; break; } } }
3
演算法效能分析及實驗結果分析3.1
演算法效能分析
如果不考慮演算法的預先處理過程,若模式串首字母在主串中出現k次,則ZZL演算法最壞情況下比較次數為k*(M-1)<k*M。如果考慮演算法的預先處理過程,則總的比較次數需再加上N次,即為k*M+N。
3.2
實驗結果
為了評測該演算法的效能,隨機的抽取一段文本和模式串,並在同一台電腦上用不同的演算法進行
匹配。測試文本主串S="From automated teller machines and atomic clocks to
mammograms and semiconductors,innumerable products and services rely in
some way on technology,measurement,and standards provided by the
National Institute of Standards and Technology",模式串T="products and
services"。分別用BF演算法、KMP演算法、BM演算法、Sunday演算法和ZZL演算法在同一台電腦上進行匹配計算,並統計每種演算法匹配時總的字元
匹配次數。測試結果如表1。
表
1
匹配演算法實驗結果
| 演算法 |
BF |
KMP |
BM |
Sunday |
ZZL |
| 一次匹配的總的字元匹配次數 |
116 |
95 |
108 |
110 |
23 |
4
結論 對於頻繁使用的要匹配的主串和模式串來說,由於預先儲存了模式串在主串中的所有儲存位置,所以ZZL演算法的匹配速度會非常快。
參考文獻:1 朱戰立編著. 資料結構——使用C語言(第3版)[M]. 西安:西安交通大學出版社,20042 王成,劉金剛. 一種改進的字串匹配演算法[J]. 電腦工程,2006,32(2):62-643 Christian Charras, Thierry Lecroq. Exact String Matching Algorithms[Z]. http://www-igm.univmlv.fr/~lecroq/string/
4黃中清,汪文勇,黃鸝聲. 基於WinPcap和改進的BM演算法的網路資訊審計系統的實現[Z].http://www.ahcit.com/lanmuyd.asp?id=1180