模式匹配-概述

模式匹配

模式匹配是字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。假设模式P是给定的子串,目标T是待查找的字符串,要求从目标T中找出与模式P相同的所有子串,这个问题成为模式匹配问题。P称为模式,T称为目标。如果T中存在一个或多个模式为P的子串,就给出该子串在T中的位置,称为匹配成功;否则匹配失败。


首先,鸟瞰一下模式匹配的发展历程(个别有出入没有细查)。

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)。


1977年,R.S.Boyer 和 J.S.Moore 共同提出一种新的字符串匹配算法 BM 算法。此后,又有一些更有效率的算法被提出,大多都是在KMP算法或BM算法的基础上做了一些改进。比如Tuned Boyer-Moore算法。 


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)算法。


转载于:https://my.oschina.net/dubenju/blog/419486

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值