模式匹配算法
模式匹配是字符串的一種基本運算,給定一個子串,要求在某個字符串中找出與該子串相同的全部子串,這就是模式匹配。假設模式P是給定的子串,目標T是待查找的字符串,要求從目標T中找出與模式P相同的全部子串,這個問題成爲模式匹配問題。P稱爲模式,T稱爲目標。若是T中存在一個或多個模式爲P的子串,就給出該子串在T中的位置,稱爲匹配成功;不然匹配失敗。post
首先,鳥瞰一下模式匹配的發展歷程(個別有出入沒有細查)。性能
1970年,S.A.COOK從理論上證實了串匹配問題能夠在O(m+n)(m爲模式P的長度,n爲文本r的長度)時間內解決。設計
1975年Alfred V.Aho和Margaret J.Corasick提出了Aho Corasick( AC)算法。字符串
1977年,D.E.Knuth,T.H.Moms和V.R.Pratt提出了著名的KMP算法,它的時間複雜度爲O(m+n)。it
1977年,R.S.Boyer 和 J.S.Moore 共同提出一種新的字符串匹配算法 BM 算法。此後,又有一些更有效率的算法被提出,大多都是在KMP算法或BM算法的基礎上作了一些改進。好比Tuned Boyer-Moore算法。 ast
1980年Nigel Horspool發表Boyer-Moore-Horspool算法,基於BM算法上的改進算法。效率
1987年,Karp 和 Rabin 共同提出了 Karp-Rabin 算法,該算法採用的思想徹底不一樣於KMP 算法和BM 算法。基礎
1986年Apostolico A.和Giancarlo R.發表了Apostolico Giancarlo(AG算法)。擴展
1990 年,Sunday D.M 提出了基於 BM 算法的一種改進簡化的算法Sunday算法,成爲實際應用中的一種高效算法。
1991年Baeza.Yates提出的Shift.Or算法。
1991年Wu.Manber提出的Wu.Manber算法,
1992年Simon等人提出的Simon算法。
1994年出現了BDM算法。其後又有多種相關的改進算法,如Turbo BDM,TurboRF,LNDM,DFDM等算法,這些算法均有較好的時間複雜度。
2000年,Navarro等人提出了基於BM算法的多模式匹配算法。
後綴樹的概念最先由Weiner於1973年提出,由McCreight在1976年和Ukkonen在1992年和1995年加以改進完善。
Bitap 算法
1964年,Bálint Dömölki介紹了精確的字符串搜索bitap算法,
1977年,由R. K. Shyamasundar進行了擴展,
在Ricardo Baeza-Yates,Gaston Gonnet等的成果的基礎上,1991年,Manber和Wu等演示了模糊搜索字符串的應用。
1996年,Baeza-Yates和Navarro改善了該算法的性能,1998年,Eugene Myers演示了長模式的適用方法。
其餘
以及利用位並行方法設計的Shift-And和Shift-Or算法。
以及基於子串搜索的Backward Dawg Matching(BDM)、
Backward Nondeterministic Dawg Matching(BNDM)利用自動機的算法和
利用Factor Oracle的Backward Oracle Matching(BOM)算法。