AC自动机-算法详解
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自动机-算法详解相关推荐
- 极限定律 My Algorithm Space AC自动机算法详解
转载自:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 首先简要介绍一下AC自动机:Aho-Corasick automatio ...
- AC自动机算法详解以及Java代码实现
详细介绍了AC自动机算法详解以及Java代码实现. 文章目录 1 概念和原理 2 节点定义 3 构建Trie前缀树 3.1 案例演示 4 构建fail失配指针 4.1 案例演示 5 匹配文本 5.1 ...
- AC自动机 算法详解(图解)及模板
要学AC自动机需要自备两个前置技能:KMP和trie树(其实个人感觉不会kmp也行,失配指针的概念并不难) 其中,KMP是用于一对一的字符串匹配,而trie虽然能用于多模式匹配,但是每次匹配失败都需要 ...
- Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现
多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...
- Popular Cows POJ - 2186(tarjan算法)+详解
题意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有 N头牛,给你M对整数(A,B),表示牛 A认为牛B受欢迎.这种关系是具有传递性的,如果 A认为 B受欢迎, B认为 C受欢迎,那么牛 A也认为牛 ...
- 计算机图形几何算法详解勘误
一直在看<计算机图形几何算法详解>这本书,但是在用的过程中发现了一些错误,一直以为是自己的错误,后来在网上找到了这本书的勘误信息,不过是英文原版的,但是还是想贴出来,以便查找 07 Jul ...
- 【强化学习】DDPG(Deep Deterministic Policy Gradient)算法详解
http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html 引用莫凡老师的素材 https://morvanzhou.github.io/tut ...
- 推荐系统简介+算法详解+项目介绍
目录标题 推荐系统简介 1.推荐系统目的 2.推荐系统的应用 3.推荐系统的基本思想 4.推荐系统的数据分析 5.推荐系统的分类 6.推荐算法简介 6.1 基于人口统计学的推荐算法(基于用户数据) 6 ...
- 【强化学习】Policy Gradient算法详解
DeepMind公开课https://sites.google.com/view/deep-rl-bootcamp/lectures David Silver教程 http://www0.cs.ucl ...
- 谱聚类算法详解及代码实现
谱聚类算法详解及代码实现 文章目录 谱聚类算法详解及代码实现 参考 关于谱聚类介绍 谱聚类概述 谱聚类前置知识 无向权重图 邻接矩阵 度矩阵 拉普拉斯矩阵 相似度矩阵 确定目标函数 初始化目标函数(最 ...
最新文章
- Win10启动盘制作工具
- 微软100题第11题
- jq绑定的事件不生效
- client mac addr不能开机进不去系统_用asp.net core结合fastdfs打造分布式文件存储系统
- MTK(android init.rc) 写一个开机启动的服务
- 01章.计算机网络概述(1.1~1.6)
- [转]nodejs深入学(7)理解Buffer
- LeetCode_Maximum Subarray | Maximum Product Subarray
- 春运前夕探秘动车所里的“动车体检医生”
- PIC温控器c语言程序,PIC单片机温感器DS18B20 C语言程序代码
- java解压jar包的方法_Java 打包成jar包 和 解压jar包
- PC浏览器如何设置代理
- 苹果内购后台(java)验证订单
- 计算机网络启动慢,台式电脑开机网络连接慢的解决办法
- 19 广域网 WAN
- 2000-2020年上市公司常用控制变量数据整理
- Python实现数据保存为PSV文件(先创建CSV,转换成PSV)
- 蛋蛋弹车3-具有功能安全EPS系统设计(电机控制算法-PID)
- LTE Cognitive Femtocell scenario
- 千岛酱行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
热门文章
- 【C++】【Opencv】【vs2015】环境配置
- EXCEL同一个数据较多的表格里自己比较数据(分屏)
- php 同时登录怎么办,php 实现同一个账号同时只能一个人登录
- 实习踩坑之路:URL传参错误,导致后台查不到数据,但是不报错
- 祝福 Stephan Ewen,Apache Flink 将继续前行 !
- 漫画:老板给员工画饼记
- 天天工作拧螺丝,怎么突破瓶颈?
- linux文件监控和同步,(转)Linux下经过rsync与inotify(异步文件系统事件监控机制)实现文件实时同步...
- mysql server 6.0_MySQL Server 6.0完全卸载以及卸载中遇到的问题
- 列举计算机组装所需的各个硬件,计算机组装和维修期中考试.doc