1. 程式人生 > >字串匹配最高效的演算法

字串匹配最高效的演算法

   BF(BruteForce)演算法核心思想是:首先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)。
KMP演算法   KMP(Knuth-Morris-Pratt)演算法核心思想是:在發生失配時,主串不需要回溯,而是利用已經得到的“部分匹配”結果將模式串右移儘可能遠的距離,繼續進行比較。這裡要強調的是,模式串不一定向右移動一個字元的位置,右移也不一定必須從模式串起點處重新試匹配,即模式串一次可以右移多個字元的位置,右移後可以從模式串起點後的某處開始試匹配。
BM演算法
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])。

Sunday演算法

   Sunday演算法是DanielM.Sunday於1990年提出的一種比BM演算法搜尋速度更快的演算法。其核心思想是:在匹配過程中,模式串並不被要求一定要按從左向右進行比較還是從右向左進行比較,它在發現不匹配時,演算法能跳過儘可能多的字元以進行下一步的匹配,從而提高了匹配效率。
假設在發生不匹配時S[i]≠T[j],1≤i≤N,1≤j≤M。此時已經匹配的部分為u,並假設字串u的長度為L。如圖1。明顯的,S[L+i+1]肯定要參加下一輪的匹配,並且T[M]至少要移動到這個位置(即模式串T至少向右移動一個字元的位置)。