Aho-Corasick 多模式匹配算法、AC自动机详解
来源:互联网 发布:足球竞彩数据分析app 编辑:程序博客网 时间:2024/05/01 21:48
http://www.cnblogs.com/xudong-bupt/p/3433506.html
Aho-Corasick算法是多模式匹配中的经典算法,目前在实际应用中较多。
Aho-Corasick算法对应的数据结构是Aho-Corasick自动机,简称AC自动机。
搞编程的一般都应该知道自动机FA吧,具体细分为:确定性有限状态自动机(DFA)和非确定性有限状态自动机NFA。普通的自动机不能进行多模式匹配,AC自动机增加了失败转移,转移到已经输入成功的文本的后缀,来实现。
1.多模式匹配
多模式匹配就是有多个模式串P1,P2,P3...,Pm,求出所有这些模式串在连续文本T1....n中的所有可能出现的位置。
例如:求出模式集合{"nihao","hao","hs","hsr"}在给定文本"sdmfhsgnshejfgnihaofhsrnihao"中所有可能出现的位置。
2.Aho-Corasick算法
使用Aho-Corasick算法需要三步:
1.建立模式的Trie
2.给Trie添加失败路径
3.根据AC自动机,搜索待处理的文本
下面说明这三步:
2.1建立多模式集合的Trie树
Trie树也是一种自动机。对于多模式集合{"say","she","shr","he","her"},对应的Trie树如下,其中红色标记的圈是表示为接收态:
2.2为多模式集合的Trie树添加失败路径,建立AC自动机
构造失败指针的过程概括起来就一句话:设这个节点上的字母为C,沿着他父亲的失败指针走,直到走到一个节点,他的儿子中也有字母为C的节点。然后把当前节点的失败指针指向那个字母也为C的儿子。如果一直走到了root都没找到,那就把失败指针指向root。
使用广度优先搜索BFS,层次遍历节点来处理,每一个节点的失败路径。
特殊处理:第二层要特殊处理,将这层中的节点的失败路径直接指向父节点(也就是根节点)。
2.3根据AC自动机,搜索待处理的文本
从root节点开始,每次根据读入的字符沿着自动机向下移动。
当读入的字符,在分支中不存在时,递归走失败路径。如果走失败路径走到了root节点,则跳过该字符,处理下一个字符。
因为AC自动机是沿着输入文本的最长后缀移动的,所以在读取完所有输入文本后,最后递归走失败路径,直到到达根节点,这样可以检测出所有的模式。
3.Aho-Corasick算法代码示例
模式串集合:{"nihao","hao","hs","hsr"}
待匹配文本:"sdmfhsgnshejfgnihaofhsrnihao"
代码:
输出:
(上面的两个图,参考网页:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html)
dante:
失败指针的含义就是,我目前搜这个分支对应的字符串,是否在其他分支上有重复的部分,有可以利用上我已经做的比较的部分
- Aho-Corasick 多模式匹配算法、AC自动机详解
- Aho-Corasick 多模式匹配算法、AC自动机详解
- 多模式串匹配之AC自动机算法(Aho-Corasick算法)简介与C语言程序实现源码参考
- 多模式串匹配之AC自动机算法(Aho-Corasick算法)简介与C语言程序实现源码参考
- Aho-Corasick自动机算法(简称AC自动机
- Aho-Corasick 多模式匹配算法
- Aho-Corasick自动机算法(AC算法解读)
- 【AC自动机】:Aho-Corasick算法的实现
- Aho-Corasick automation,AC 自动机
- 【算法笔记】Aho-Corasick 算法(AC自动机) 小结
- 浅谈AC自动机(Aho-Corasick automaton算法)
- Aho-Corasick算法—Trie图(AC自动机)
- 多模匹配算法之Aho-Corasick
- AC自动机(Aho-Corasick automaton)
- AC自动机(Aho-Corasick Automaton Algorithm)
- AC自动机——Aho-Corasick Automaton
- 深入理解Aho-Corasick自动机算法
- 多字符串匹配-aho-corasick算法
- 菜鸟的安卓之路。2016.06.08
- 如何判断Unix系统的一个库文件是32位还是64位的
- 排序算法——选择排序
- java注解及在butternife中的实践和原理
- poj 3608 Bridge Across Islands(旋转卡壳求凸包最短距离)
- Aho-Corasick 多模式匹配算法、AC自动机详解
- UINavigationController和Storyboard的应用
- C语言的字符串(篇章之二)
- 关于获取默认List Title国际化 获取情况
- JPanel面板容器类
- 线程池和数据库连接池的原理
- 重载算术操作符
- LinuxELF文件格式详解--Linux进程的管理与调度(十二)
- http请求返回码