多模式串匹配之ac自动机算法

多模式串匹配之ac自动机算法

ID:23126675

大小:200.27 KB

页数:9页

时间:2018-11-04

多模式串匹配之ac自动机算法_第1页
多模式串匹配之ac自动机算法_第2页
多模式串匹配之ac自动机算法_第3页
多模式串匹配之ac自动机算法_第4页
多模式串匹配之ac自动机算法_第5页
资源描述:

《多模式串匹配之ac自动机算法》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、多模式串匹配之AC自动机算法(Aho-Corasick算法)简介与C语言程序实现源码参考·任侠发布于2011-03-22  22:27:53 一、概述AC自动机算法全称Aho-Corasick算法,是一种字符串多模式匹配算法。该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。AC算法用于在一段文本中查找多个模式字符串,即给你很多字符串,再给你一段文本,让你在文本中找这些串是否出现过,出现过多少次,分别在哪里出现。该算法应用有限自动机巧妙地将字符比较转化为了状态转移。此算法有两个特点,一个是扫描文本时完全不需要回溯,另一个是时间复杂度为O(n),时间复杂

2、度与关键字的数目和长度无关,但所需时间和文本长度以及所有关键字的总长度成正比。AC算法有三个主要步骤,一个是字典树tire的构造,一个是搜索路径的确定(即构造失败指针),还有就是模式匹配过程。学习AC自动机算法之前,最好先熟悉KMP算法,因为KMP算法与字典树tire的构造很是类似。KMP算法是一种经典的单字符串匹配算法。二、AC算法思想 AC算法思想:用多模式串建立一个确定性的树形有限状态机,以主串作为该有限状态机的输入,使状态机进行状态的转换,当到达某些特定的状态时,说明发生模式匹配。下图是多模式he/she/his/hers构成的一个确定性有限状态机,做几点

3、说明:图2.11、该状态机优先按照实线标注的状态转换路径进行转换,当所有实线标注的状态转换路径条件不能满足时,按照虚线的状态转换路径进行状态转换。如:状态0时,当输入h,则转换到状态1;输入s,则转换到状态3;否则转换到状态0。2、匹配过程如下:从状态0开始进行状态转换,主串作为输入。如主串为:ushers,状态转换的过程是这样的:图2.23、 当状态转移到2,5,7,9等红色状态点时,说明发生了模式匹配。如主串为:ushers,则在状态5、2、9等状态时发生模式匹配,匹配的模式串有she、he、hers。定义:在预处理阶段,AC自动机算法建立了三个函数,转向函数

4、goto,失效函数failure和输出函数output,由此构造了一个树型有限自动机。转向函数,指的是一种状态之间的转向关系。g(pre,x)=next:状态pre在输入一个字符x后转换为状态next(上图中的实线部分)。如果在模式串中不存在这样的转换,则next=failstate。失效函数,指的也是状态和状态之间一种转向关系。f(per)=next:是在比较失配的情况下使用的转换关系。在构造转向函数时,把不存在的转换用failstate表示,但是failstate不是一个具体的状态,状态机转换转换到failstate状态的时候就不知道该往哪转了。所以就要在状态

5、机中找到一个有意义的状态代替failstate,当出现failstate状态时,自动切换到那个状态。这个状态节点应该具有这样的特征:从这个状态节点向上直到树根节点(状态0)所经历的输入字符,和从产生failstate状态的那个状态节点向上所经历的输入字符串完全相同。而且这个状态节点,是所有具备这些条件的节点中深度最大的那个节点。如果不存在满足条件的状态节点,则失效函数为0。累死了。举例子说吧,对状态9输入任何一个字符都会产生failstate状态,需要失效函数。状态3向上到状态0经过的输入字符串为s;而由状态9向上的输入字符串为sreh。字符串s相同,并且状态3是

6、满足此条件的唯一节点,则f(9)=3。说来说去,失效函数就是要干这么件事儿:图2.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时,如图2.4所示。转向函数:图2.4失效函数:图2

7、.5输出函数:图2.6 三、字典树tire的构造这个比较好理解,就是把要匹配的一些字符串添加到树结构中去。树边就是单词中的字符,单词中最后一个字符的连接节点添加标志,以表示改节点路径包含1个字典中的字符串,搜索到此节点就表示找到了字典中的某个单词,可以直接输出。Trie是一个树形结构的状态装换图,从一个结点到它的各个子结点的边上有不同的标号。Trie的叶子结点表示识别到的关键字。当我们的模式串在Tire上进行匹配时,如果与当前节点的关键字不能继续匹配的时候,就应该去当前节点的失败指针所指向的节点继续进行匹配。例子:某字典P={he,she,his,hers}对应的

8、字典树如下

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。