模式匹配算法
模式匹配是字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的全部子串,这就是模式匹配。假设模式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)算法。