摘要:
在我的《AC算法详解》一文中,还存在一个很大的疏漏,那就是用蛮力法计算自动机的fail跳转表,这实际上是一个极度低效的方法。在Aho,Corasick两人的论文中,给出的是逐层求fail表的方法,两人证明了这个方法可以在O(n)(其中n为所有模式串的总长度和)时间复杂度内计算出模式集合P的fa... 阅读全文
摘要:
之前我的《BM算法详解》一文中有一个巨大的缺憾,就是没能给出计算模式串好后缀跳转表的高效算法。Robert S.Boyer和J Strother Moore两人的论文中,不知什么原因,并没有给出这样的算法,蛮力算法O(n^3)的时间复杂度使得BM算法的实用性大打折扣。实际上线性时间内计算出模... 阅读全文
摘要:
KMP算法中next[i]与Zi(S)的对应关系 我在《KMP算法详解》一文中已经介绍了next[i]的含义,对于S[i],next[i]的意义是,如果存在k使得S[1...i-k]=S[k...i-1]且S[i-k+1]!=S[i],那么next[i]=i-k+1。实际上对于满足条件的k,... 阅读全文
摘要:
Trie结构是模式匹配中经常用到的经典结构,在字符串处理中发挥着重要的作用,比如分词算法,就会利用Trie结构将分句的已知词条先识别出来,然后再判断剩下的未识别部分是否是新的未知词。 经典的Trie结构如下图所示, 是一个典型的多叉树结构,为了保证用Trie结构进行模式匹配的效率,T... 阅读全文
摘要:
之前我的文章中,介绍了KMP,BM,AC,WM等几个经典的模式匹配算法,本文我将对常用的模式匹配算法做一小结。 模式匹配算法的关系图如下所示: 这里有几个我的文章中暂时没有涵盖的算法,这里做一简要说明。 Rabin-Karp算法,这是一个基于散列值的模式匹配算法,根据散列算法,将长度为... 阅读全文
摘要:
AC算法是Alfred V.Aho(《编译原理》(龙书)的作者),和Margaret J.Corasick于1974年提出(与KMP算法同年)的一个经典的多模式匹配算法,可以保证对于给定的长度为n的文本,和模式集合P{p1,p2,...pm},在O(n)时间复杂度内,找到文本中的所有目标模式,... 阅读全文
摘要:
提到多模式匹配算法,就得说一下Wu-Manber算法,其在多模式匹配领域相较于Aho-Corasick算法,就好象在单模式匹配算法中BM算法相较于KMP算法一样,在绝大多数场合,Wu-Manber算法的匹配效率要好于Aho-Corasick算法。这个算法是由吴升(台湾)和他的导师Udi Man... 阅读全文
摘要:
KMP算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法。但是相较于其他模式匹配算法,该算法晦涩难懂,第一次接触该算法的读者往往会看得一头雾水,主要原因是KMP算法在构造跳... 阅读全文
摘要:
1977年,Robert S.Boyer和J Strother Moore提出了另一种在O(n)时间复杂度内,完成字符串匹配的算法,其在绝大多数场合的性能表现,比KMP算法还要出色,下面我们就来详细了解一下这一出色的单模式匹配算法,在此之前推荐读者读一下我的另一篇文章 在讲解Boyer-Mo... 阅读全文