AC多模式匹配算法
建议:
学习ac算法最好的途径是看论文pdf_Efficient_String_Matching_An_Aid_to_Biblio
一、一般的搜索算法
keyword: { he, she, his, her }
text: "ushers"

- 总结:
如上图所示,一般的搜索过程需要每个关键字依次搜索,这是时间复杂度最高的算法。
当然,可以把每个关键字搜索过程优化为 KMP 或者 BM 算法,但仍然需要每个关键字都搜索一遍。
KMP、BM是单模匹配算法,使用多模匹配算法 AC 即可优雅解决此问题。
二、AC 算法的搜索过程
1.三个函数
goto 函数

fail 函数

output 函数

省略了 output(state) = empty 的情况
2.算法一 - 搜索过程
keyword: { he, she, his, her }
text: "ushers"
- 总结:
可以看到使用 AC 算法的搜索过程仅遍历了一次 text ,就找到了所有匹配 keyword。
搜索过程从状态0开始,通过 goto() 函数进行状态转换,每次转换状态都会执行 output() 函数,如果返回值不为空,说明匹配到关键字。goto() 函数返回 fail 的情况,执行 fail() 函数进行状态转换。
g(0,x) 没有失败的情况,至少会跳转到状态0
fail(x) 也没有失败的情况,至少会跳转到状态0
fail(x) 还存在优化的余地,假设 keyword 中没有 hers ,则这次 f(5) 就一次无用的跳转。
算法一:
三、生成 goto() fail() output() 函数的过程
1.算法二 - 生成 goto() 函数 和 不完整的 output() 函数
构造 goto() 函数的过程就是生成 goto() 前缀树的过程。从仅有一个点(状态为0)的前缀树开始,逐个添加关键字到前缀树即可。
1.添加 "he" 关键字

2.添加 "she" 关键字
]3.添加 "his" 关键字

4.添加 "hers" 关键字

5.起点(状态0)作特殊处理,使 g(0, x) 永远不会返回 fail,x表示任意字符。

总结:
output() 函数目前还不完整,比如 output(5) 应该为 {she, he } 才能完整匹配所有关键字。所以还需要另外一个算法完成 output() 函数。
算法二
2.算法三 - 生成 fail() 函数 并补充 output() 函数
注:
为表述方便,此处虚拟了 state() 函数。
例如:state("he")表示字符串"he"在goto() 前缀树中所表示的状态值,并非真实存在的函数。
长度为1的字符串,其 fail() 返回值肯定是0。
情况1:2个字符串的 fail() 返回值

情况2:3个字符串的 fail() 返回值

情况3:4个字符串的 fail() 返回值

情况4:4个字符串的 fail() 返回值。
这里与情况3有一点区别,字符串 "ashe" 的最长子串 "she" 并不是关键字,所以我们认为 "he" 是 "ashe" 的最长子串,所以字符串 "ashe" 的 fail() 返回值是 "he" 的状态值。
总结:
以上4种情况,间接表示了 fail() 函数生成过程,尤其是伪代码中while g(staet, a) = fail do state <- f(state)的含义,即找到一个字符串的状态值,此字符串是当前关键词的最长后缀,同时又是其他关键词的前缀。然后 fail(s) 就等于我们找到的这个状态值。
算法三:
附件列表
AC多模式匹配算法的更多相关文章
- 彻底理解AC多模式匹配算法
(本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...
- [转] 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 转载自:http://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boy ...
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽
字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 ...
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法
ref : https://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP ...
- Java数据结构之字符串模式匹配算法---Brute-Force算法
模式匹配 在字符串匹配问题中,我们期待察看源串 " S串 " 中是否含有目标串 " 串T " (也叫模式串).其中 串S被称为主串,串T被称为子串. 1.如果在 ...
- 《数据结构》之串的模式匹配算法——KMP算法
//串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstri ...
- KMP模式匹配算法
KMP模式匹配算法 相信很多人对于这个还有点不了解,或者说是不懂,下面,通过一道题,来解决软考中的这个问题! 正题: aaabaaa,其next函数值为多少? 对于这个问题,我们应该怎么做呢? 1.整 ...
- 线性表-串:KMP模式匹配算法
一.简单模式匹配算法(略,逐字符比较即可) 二.KMP模式匹配算法 next数组:j为字符序号,从1开始. (1)当j=1时,next=0: (2)当存在前缀=后缀情况,next=相同字符数+1: ( ...
- 数据结构- 串的模式匹配算法:BF和 KMP算法
数据结构- 串的模式匹配算法:BF和 KMP算法 Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...
随机推荐
- [原]zoj3772--【水题】线段树区间查询+矩阵乘法
思路来源:http://blog.csdn.net/u013654696/article/details/23037407#comments [做浙大校赛的时候没有看这道题,事后做的.思路不是自己的, ...
- 网易新闻页面信息抓取 -- htmlagilitypack搭配scrapysharp
最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决定试一试~ 于是到https://www.nuget.org/packages/Scrapy ...
- TCSRM5961000
一直没想到怎么去重 看了眼别人的代码...so easy啊 同余啊 唉..脑子被僵尸吃掉了 难得1000出个简单的 #include <iostream> #include<cstd ...
- 日期选择插件clndr的使用
需求是:在HTML中绘制日历直接供用户选择 而不是使用datepicker之类的表单插件让用户点击input后弹出datepicker让用户选择 浏览了一些解决方案后,发现 CLNDR 这个jQue ...
- website project team member 角色及开发过程概念图
一个web项目的团队往往具有以下角色的人员组成: project stakeholder(client or business owner)产品经理 Project manager 项目经理 prod ...
- bootstrapValidator对于隐藏域验证和程序赋值即时验证的问题
问题1: 如下代码: <input type="hidden" name="productId"/> $("#addForm") ...
- C# 对List成员排序的简单方法
网上看到的方法,实在太方便了,转过来保存,原链接: http://blog.csdn.net/wanzhuan2010/article/details/6205884 using System; us ...
- POJ 3693 (后缀数组) Maximum repetition substring
找重复次数最多的字串,如果有多解,要求字典序最小. 我也是跟着罗穗骞菊苣的论文才刷这道题的. 首先还是枚举一个循环节的长度L,如果它出现两次的话,一定会包含s[0], s[L], s[2L]这些相邻两 ...
- 【转】strcpy溢出的攻击示例
在学习c/c++的时候,就讲到了一些C类型的字符串函数不是安全的,比如strcpy没有检查长度会溢出,推荐使用strncpy,笔试面试也经常问到.同时经常浏览安全相关的新闻,缓冲区溢出攻击是很常见的一 ...
- Ensemble Learning 之 Bagging 与 Random Forest
Bagging 全称是 Boostrap Aggregation,是除 Boosting 之外另一种集成学习的方式,之前在已经介绍过关与 Ensemble Learning 的内容与评价标准,其中“多 ...


