网站大量收购独家精品文档,联系QQ:2885784924

AC算法詳解.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AC算法詳解

一、概述AC算法是一个经典的多模式匹配算法,可以保证对于给定的长度为n的文本,和模式集合P{p1,p2,...pm},在O(n)时间复杂度内,找到文本中的所有目标模式,而与模式集合的规模m无关。要理解AC算法,仍然需要对KMP算法的透彻理解。KMP中我们用两个指针i和j分别表示,A[i-j+ 1..i](目标串)与B[1..j](模式串)完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前j个字符,当A[i+1]≠B[j+1],KMP的策略是调整j的位置(减小j值)使得A[i-j+1..i]与B[1..j]保持匹配且新的B[j+1]恰好与A[i+1]匹配,而next函数恰恰记录了这个j应该调整到的位置。同样AC自动机的失败指针具有同样的功能,也就是说当我们的模式串在Tire上进行匹配时,如果与当前节点的关键字不能继续匹配的时候,就应该去当前节点的失败指针所指向的节点继续进行匹配。算法就是这样应用有限自动机巧妙地将字符比较转化为了状态转移。此算法有两个特点,一个是扫描文本时完全不需要回溯,另一个是时间复杂度为O(n),时间复杂度与关键字的数目和长度无关,但所需时间和文本长度以及所有关键字的总长度成正比。AC算法有三个主要步骤,一个是字典树tire的构造(即构造转向函数),一个是搜索路径的确定(即构造失败函数),还有就是模式匹配过程。二、AC算法思想算法的基本思想是这样的:在预处理阶段,AC自动机算法建立了三个函数,转向函数goto,失效函数failure和输出函数output,由此构造了一个树型有限自动机。在搜索查找阶段,则通过这三个函数的交叉使用扫描文本,定位出关键字在文本中的所有出现位置。下图是多模式{he, she, his ,hers}构成的一个确定性有限状态机,做几点说明:图 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自动机算法建立了三个函数,转向函数goto,失效函数failure和输出函数output,由此构造了一个树型有限自动机。转向函数,指的是一种状态之间的转向关系。g(pre, x)=next:状态pre在输入一个字符x后转换为状态next(上图中的实线部分)。失效函数,指的也是状态和状态之间一种转向关系。f(per)=next:是在比较失配的情况下使用的转换关系。在构造转向函数时,还缺少许多转换,即当状态机在状态pre输入字符y后不知道该往哪转了。所以就要在状态机中找到一个有意义的状态,当出现这种情况时,自动切换到那个状态。输出函数,指的是状态和模式串之间的一种关系。output(i)={P},表示当状态机到达状态i时,模式串集合{P}中的所有模式串可能已经完成匹配。例:模式串为{he, she, his ,hers} 时,如图2.4所示。转向函数:失效函数:输出函数:三、字典树tire的构造这个比较好理解,就是把要匹配的一些字符串添加到树结构中去。树边就是单词中的字符,单词中最后一个字符的连接节点添加标志is_final_state,以表示改节点路径包含1个模式串中的字符串,搜索到此节点就表示找到了模式串中的某个单词,可以直接输出。Trie是一个树形结构的状态装换图,从一个结点到它的各个子结点的边上有不同的标号。Trie的叶子结点表示识别到的关键字。对于给定的集合P{p1,p2,...pm},构建goto表的步骤是,对于P中的每一个模式PatternSet[1...j](1=im+1),按照其包含的字母从前到后依次输入自动机,起始状态root,如果自动机的当前状态temp,对于PatternSet[i]中的当前字母ch=PatternSet[i][k](1=k=j),没有可用的转移,则将状态机的总状态数STATE_NO+1,新建状态ch为new_state,并将当前状态temp输入ch后的转移位置置为new_state-state_no = STATE_NO,如果存在可用的转移方案temp-goto[ch]=q,则转移到状态q,同时取出模式串的下一个字母PatternSet[i][k+1],继续进行上面的判断过程。理论介绍很繁琐,让我们以之前的模式集合P{h

文档评论(0)

cv7c8hj6b4I + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档