欢迎来到天天文库
浏览记录
ID:51657697
大小:181.83 KB
页数:8页
时间:2020-03-14
《多模式串匹配之AC自动机算法.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、此文档收集于网络,如有侵权,请联系网站删除多模式串匹配之AC自动机算法(Aho-Corasick算法)简介与C语言程序实现源码参考·任侠发布于2011-03-22 22:27:53 一、概述AC自动机算法全称Aho-Corasick算法,是一种字符串多模式匹配算法。该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。AC算法用于在一段文本中查找多个模式字符串,即给你很多字符串,再给你一段文本,让你在文本中找这些串是否出现过,出现过多少次,分别在哪里出现。该算法应用有限自动机巧妙地将字符比较转化为了状
2、态转移。此算法有两个特点,一个是扫描文本时完全不需要回溯,另一个是时间复杂度为O(n),时间复杂度与关键字的数目和长度无关,但所需时间和文本长度以及所有关键字的总长度成正比。AC算法有三个主要步骤,一个是字典树tire的构造,一个是搜索路径的确定(即构造失败指针),还有就是模式匹配过程。学习AC自动机算法之前,最好先熟悉KMP算法,因为KMP算法与字典树tire的构造很是类似。KMP算法是一种经典的单字符串匹配算法。二、AC算法思想AC算法思想:用多模式串建立一个确定性的树形有限状态机,以主串作为该有限状态机的
3、输入,使状态机进行状态的转换,当到达某些特定的状态时,说明发生模式匹配。下图是多模式he/she/his/hers构成的一个确定性有限状态机,做几点说明: 图2.1此文档仅供学习与交流此文档收集于网络,如有侵权,请联系网站删除1、该状态机优先按照实线标注的状态转换路径进行转换,当所有实线标注的状态转换路径条件不能满足时,按照虚线的状态转换路径进行状态转换。如:状态0时,当输入h,则转换到状态1;输入s,则转换到状态3;否则转换到状态0。2、匹配过程如下:从状态0开始进行状态转换,主串作为输入。如主串为:ush
4、ers,状态转换的过程是这样的: 图2.23、 当状态转移到2,5,7,9等红色状态点时,说明发生了模式匹配。如主串为:ushers,则在状态5、2、9等状态时发生模式匹配,匹配的模式串有she、he、hers。定义:在预处理阶段,AC自动机算法建立了三个函数,转向函数goto,失效函数failure和输出函数output,由此构造了一个树型有限自动机。转向函数,指的是一种状态之间的转向关系。g(pre,x)=next:状态pre在输入一个字符x后转换为状态next(上图中的实线部分)。如果在模式串中不存在这
5、样的转换,则next=failstate。失效函数,指的也是状态和状态之间一种转向关系。f(per)=next:是在比较失配的情况下使用的转换关系。在构造转向函数时,把不存在的转换用failstate表示,但是failstate不是一个具体的状态,状态机转换转换到failstate状态的时候就不知道该往哪转了。所以就要在状态机中找到一个有意义的状态代替failstate,当出现failstate状态时,自动切换到那个状态。这个状态节点应该具有这样的特征:从这个状态节点向上直到树根节点(状态0)所经历的输入字符,
6、和从产生failstate状态的那个状态节点向上所经历的输入字符串完全相同。而且这个状态节点,是所有具备这些条件的节点中深度最大的那个节点。如果不存在满足条件的状态节点,则失效函数为0。累死了。举例子说吧,对状态9输入任何一个字符都会产生failstate状态,需要失效函数。状态3向上到状态0经过的输入字符串为s;而由状态9向上的输入字符串为sreh。字符串s相同,并且状态3是满足此条件的唯一节点,则f(9)=3。说来说去,失效函数就是要干这么件事儿: 图2.3意思就是说,在比较模式串1发生失配时,找一个模式
7、串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.5
8、输出函数: 图2.6三、字典树tire的构造这个比较好理解,就是把要匹配的一些字符串添加到树结构中去。树边就是单词中的字符,单词中最后一个字符的连接节点添加标志,以表示改节点路径包含1个字典中的字符串,搜索到此节点就表示找到了字典中的某个单词,可以直接输出。Trie是一个树形结构的状态装换图,从一个结点到它的各个子结点的边上有不同的标号。Trie的叶子结点表示识别到的关键字。当我们的
此文档下载收益归作者所有