1 / 17
文档名称:

多模式串匹配之AC自动机算法.doc

格式:doc   大小:206KB   页数:17页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

多模式串匹配之AC自动机算法.doc

上传人:文库旗舰店 2019/9/19 文件大小:206 KB

下载得到文件列表

多模式串匹配之AC自动机算法.doc

相关文档

文档介绍

文档介绍:多模式串匹配之AC自动机算法(Aho-Corasick算法)简介与C语言程序实现源码参考l任侠发布于2011-03-22  22:27:53    一、概述AC自动机算法全称Aho-Corasick算法,是一种字符串多模式匹配算法。该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。AC算法用于在一段文本中查找多个模式字符串,即给你很多字符串,再给你一段文本,让你在文本中找这些串是否出现过,出现过多少次,分别在哪里出现。该算法应用有限自动机巧妙地将字符比较转化为了状态转移。此算法有两个特点,一个是扫描文本时完全不需要回溯,另一个是时间复杂度为O(n),时间复杂度与关键字的数目和长度无关,但所需时间和文本长度以及所有关键字的总长度成正比。AC算法有三个主要步骤,一个是字典树tire的构造,一个是搜索路径的确定(即构造失败指针),还有就是模式匹配过程。学****AC自动机算法之前,最好先熟悉KMP算法,因为KMP算法与字典树tire的构造很是类似。KMP算法是一种经典的单字符串匹配算法。二、AC算法思想AC算法思想:用多模式串建立一个确定性的树形有限状态机,以主串作为该有限状态机的输入,使状态机进行状态的转换,当到达某些特定的状态时,说明发生模式匹配。下图是多模式he/she/his/hers构成的一个确定性有限状态机,做几点说明:、该状态机优先按照实线标注的状态转换路径进行转换,当所有实线标注的状态转换路径条件不能满足时,按照虚线的状态转换路径进行状态转换。如:状态0时,当输入h,则转换到状态1;输入s,则转换到状态3;否则转换到状态0。2、匹配过程如下:从状态0开始进行状态转换,主串作为输入。如主串为:ushers,状态转换的过程是这样的:、 当状态转移到2,5,7,9等红色状态点时,说明发生了模式匹配。如主串为:ushers,则在状态5、2、9等状态时发生模式匹配,匹配的模式串有she、he、hers。定义:在预处理阶段,AC自动机算法建立了三个函数,转向函数goto,失效函数failure和输出函数output,由此构造了一个树型有限自动机。转向函数,指的是一种状态之间的转向关系。g(pre,x)=next:状态pre在输入一个字符x后转换为状态next(上图中的实线部分)。如果在模式串中不存在这样的转换,则next=failstate。失效函数,指的也是状态和状态之间一种转向关系。f(per)=next:是在比较失配的情况下使用的转换关系。在构造转向函数时,把不存在的转换用failstate表示,但是failstate不是一个具体的状态,状态机转换转换到failstate状态的时候就不知道该往哪转了。所以就要在状态机中找到一个有意义的状态代替failstate,当出现failstate状态时,自动切换到那个状态。这个状态节点应该具有这样的特征:从这个状态节点向上直到树根节点(状态0)所经历的输入字符,和从产生failstate状态的那个状态节点向上所经历的输入字符串完全相同。而且这个状态节点,是所有具备这些条件的节点中深度最大的那个节点。如果不存在满足条件的状态节点,则失效函数为0。累死了。举例子说吧,对状态9输入任何一个字符都会产生failstate状态,需要失效函数。状态3向上到状态0经过的输入字符串为s;而由状态9向上的输入字符串为sreh。字符串s相同,并且状态3是满足此条件的唯一节点,则f(9)=3。说来说去,失效函数就是要干这么件事儿:,在比较模式串1发生失配时,找一个模式串2,使得P2[0...j-1]=P1[i-j+1...i]。然后继续比较模式串2。看上面那个图,想起点儿什么东西没有?对了,是KMP算法。有人说AC算法就是KMP算法在多模式匹配情况下的扩展。输出函数,指的是状态和模式串之间的一种关系。output(i)={P},表示当状态机到达状态i时,模式串集合{P}中的所有模式串可能已经完成匹配。例:模式串为:he/she/hers/his时,。转向函数:::、字典树tire的构造这个比较好理解,就是把要匹配的一些字符串添加到树结构中去。树边就是单词中的字符,单词中最后一个字符的连接节点添加标志,以表示改节点路径包含1个字典中的字符串,搜索到此节点就表示找到了字典中的某个单词,可以直接输出。Trie是一个树形结构的状态装换图,从一个结点到它的各个子结点的边上有不同的标号。Trie的叶子结点表示识别到的关键字。当我们的模式串在Tire上进行匹配时,如果与当前节点的关键字不能继续匹配的时候,就应该去当前节点的失败指针所指向的节点继续进行匹配。例子:某字典P={he,she,his,hers}对应的字典树如下