What's Aho-Corasick automaton?

  一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一。

  简单的说,KMP用来在一篇文章中匹配一个模式串;但如果有多个模式串,需要在一篇文章中把出现过的模式串都匹配出来,就需要Aho-Corasick automaton算法了。

My Understanding About Aho-Corasick automaton

    我的理解:Aho-Corasick automaton = Trie + KMP

  在KMP算法中,匹配单个字符的时候,我们只需要按照文本线性的扫一遍,然后中途失配的时候,next数组会引导k回溯到正确的位置进行下一步的匹配。

  但是多个模式串的时候要怎么匹配呢?Trie树不就是一个多模式的匹配吗,如果我们将KMP和Trie数结合起来,是不是会有意想不到的效果呢?

  有了这些思考,AC自动机算法就这样产生了。

  在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针,fail指针,顾名思义,就是当匹配失败的时候,用来引导k回溯的一个插穿在Trie树的各个节点之间的一些指针,就和KMP算法中的next数组是一样的道理。

  关于fail指针的构建,推荐看一下李翔大神的PPT。

  ppt下载链接:

    http://wenku.baidu.com/view/93af2c936bec0975f465e2f1.html

1.构建Trie树

  

  

2.在Trie树上构建fail指针

  

  

构建完fail指针后,我们就用文章来对这棵Trie树进行匹配了。

  匹配过程分两种情况:

  • 当前字符匹配,表示从当前节点沿着树边有一条路径可以到达目标字符,此时只需沿该路径走向下一个节点继续匹配即可,目标字符串指针移向下个字符继续匹配;
  • 当前字符不匹配,则去当前节点fail指针所指向的字符继续匹配,匹配过程随着指针指向root结束。重复这2个过程中,直到模式串走到结尾为止。

  对照上图,看一下模式匹配这个详细的流程,其中模式串为yasherhs。

  对于i=0,1。Trie中没有对应的路径,故不做任何操作;i=2,3,4时,指针p走到左下节点e。

  因为节点e的count信息为1,所以cnt+1,并且讲节点e的count值设置为-1,表示改单词已经出现过了,防止重复计数,最后temp指向e节点的失败指针所指向的节点继续查找,以此类推,最后temp指向root,退出while循环,这个过程中count增加了2,表示找到了2个单词she和he。

  当i=5时,程序进入第5行,p指向其失败指针的节点,也就是右边那个e节点,随后在第6行指向r节点,r节点的count值为1,从而count+1,循环直到temp指向root为止。

  最后i=6,7时,找不到任何匹配,匹配过程结束。

匹配过程总结:

从root节点开始,每次根据读入的字符沿着自动机向下移动。

当读入的字符,在分支中不存在时,递归走Fail指针。如果走Fail指针走到了root节点,则跳过该字符,处理下一个字符。
因为AC自动机是沿着输入文本的最长后缀移动的,所以在读取完所有输入文本后,最后递归走Fail指针,直到到达根节点,这样可以检测出所有的模式。
这个过程和KMP算法的匹配也是非常相似,当然这一步就非常灵活了,我们需要通过多做题来提高熟练度。

Time Complexity Analyse

假设有N个模式串,平均长度为L;文章长度为M。

建立Trie树:O(N*L)

建立fail指针:O(N*L)

模式匹配:O(M*L) (注:之所以要乘以一个L,是因为在统计的时候需要顺着链回溯到root结点)

所以,总时间复杂度为:O( (N+M)*L )

Some Good Selection Of Standard Exercise

Entry:

  • Hdu 2222
  • Hdu 3695 Computer Virus on Planet Pandora
  • Poj 4052 Hrinity (金华邀请赛I)
  • Zoj 3430 Detect the Virus
  • Spoj 7758. Growing Strings
  • Hdu 4417 GRE Words
  • Hnu 10104 病毒
  • Hnu 11187 Emoticons :-)
  • Zoj 3545 Rescue the Rabbit
  • Hdu 3341 Lost's revenge
  • Zoj 3535 Gao the String II
  • Hdu 3962 Microgene
  • 大视野 2434 阿狸的打字机
  • Hdu 3247 Resource Archiver
  • Zoj 3494 BCD Code

synthesize problems:

  • TSP HDU 3341. Lost's revenge   HDU 3247. Resource Archiver
  • 状态压缩、可变进制编码 HOJ 2951. Writing Robot / HDU 3505
  • 最大权闭合子图 ZeroJudge b179.Cans
  • 自动机 DP、fail 指针转移 CodeChef July Challenge 2012. Favourite Numbers
  • 二分答案、数位 DP、构造方案 Andrew Stankevich's Contest #2, Problem A, Non Absorbing DFA
  • 预处理、DP、高精度 SPOJ. 9941. GRE Words / HDU 4117

转载于:https://www.cnblogs.com/crazyacking/p/4002807.html

AC自动机-算法详解相关推荐

  1. 极限定律 My Algorithm Space AC自动机算法详解

    转载自:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 首先简要介绍一下AC自动机:Aho-Corasick automatio ...

  2. AC自动机算法详解以及Java代码实现

    详细介绍了AC自动机算法详解以及Java代码实现. 文章目录 1 概念和原理 2 节点定义 3 构建Trie前缀树 3.1 案例演示 4 构建fail失配指针 4.1 案例演示 5 匹配文本 5.1 ...

  3. AC自动机 算法详解(图解)及模板

    要学AC自动机需要自备两个前置技能:KMP和trie树(其实个人感觉不会kmp也行,失配指针的概念并不难) 其中,KMP是用于一对一的字符串匹配,而trie虽然能用于多模式匹配,但是每次匹配失败都需要 ...

  4. Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现

    多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...

  5. Popular Cows POJ - 2186(tarjan算法)+详解

    题意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有 N头牛,给你M对整数(A,B),表示牛 A认为牛B受欢迎.这种关系是具有传递性的,如果 A认为 B受欢迎, B认为 C受欢迎,那么牛 A也认为牛 ...

  6. 计算机图形几何算法详解勘误

    一直在看<计算机图形几何算法详解>这本书,但是在用的过程中发现了一些错误,一直以为是自己的错误,后来在网上找到了这本书的勘误信息,不过是英文原版的,但是还是想贴出来,以便查找 07 Jul ...

  7. 【强化学习】DDPG(Deep Deterministic Policy Gradient)算法详解

    http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html 引用莫凡老师的素材 https://morvanzhou.github.io/tut ...

  8. 推荐系统简介+算法详解+项目介绍

    目录标题 推荐系统简介 1.推荐系统目的 2.推荐系统的应用 3.推荐系统的基本思想 4.推荐系统的数据分析 5.推荐系统的分类 6.推荐算法简介 6.1 基于人口统计学的推荐算法(基于用户数据) 6 ...

  9. 【强化学习】Policy Gradient算法详解

    DeepMind公开课https://sites.google.com/view/deep-rl-bootcamp/lectures David Silver教程 http://www0.cs.ucl ...

  10. 谱聚类算法详解及代码实现

    谱聚类算法详解及代码实现 文章目录 谱聚类算法详解及代码实现 参考 关于谱聚类介绍 谱聚类概述 谱聚类前置知识 无向权重图 邻接矩阵 度矩阵 拉普拉斯矩阵 相似度矩阵 确定目标函数 初始化目标函数(最 ...

最新文章

  1. Win10启动盘制作工具
  2. 微软100题第11题
  3. jq绑定的事件不生效
  4. client mac addr不能开机进不去系统_用asp.net core结合fastdfs打造分布式文件存储系统
  5. MTK(android init.rc) 写一个开机启动的服务
  6. 01章.计算机网络概述(1.1~1.6)
  7. [转]nodejs深入学(7)理解Buffer
  8. LeetCode_Maximum Subarray | Maximum Product Subarray
  9. 春运前夕探秘动车所里的“动车体检医生”
  10. PIC温控器c语言程序,PIC单片机温感器DS18B20 C语言程序代码
  11. java解压jar包的方法_Java 打包成jar包 和 解压jar包
  12. PC浏览器如何设置代理
  13. 苹果内购后台(java)验证订单
  14. 计算机网络启动慢,台式电脑开机网络连接慢的解决办法
  15. 19 广域网 WAN
  16. 2000-2020年上市公司常用控制变量数据整理
  17. Python实现数据保存为PSV文件(先创建CSV,转换成PSV)
  18. 蛋蛋弹车3-具有功能安全EPS系统设计(电机控制算法-PID)
  19. LTE Cognitive Femtocell scenario
  20. 千岛酱行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)

热门文章

  1. 【C++】【Opencv】【vs2015】环境配置
  2. EXCEL同一个数据较多的表格里自己比较数据(分屏)
  3. php 同时登录怎么办,php 实现同一个账号同时只能一个人登录
  4. 实习踩坑之路:URL传参错误,导致后台查不到数据,但是不报错
  5. 祝福 Stephan Ewen,Apache Flink 将继续前行 !
  6. 漫画:老板给员工画饼记
  7. 天天工作拧螺丝,怎么突破瓶颈?
  8. linux文件监控和同步,(转)Linux下经过rsync与inotify(异步文件系统事件监控机制)实现文件实时同步...
  9. mysql server 6.0_MySQL Server 6.0完全卸载以及卸载中遇到的问题
  10. 列举计算机组装所需的各个硬件,计算机组装和维修期中考试.doc