建议:
学习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多模式匹配算法的更多相关文章

  1. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  2. [转] 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽

    字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 转载自:http://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boy ...

  3. 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽

    字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 ...

  4. 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法

    ref : https://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP ...

  5. Java数据结构之字符串模式匹配算法---Brute-Force算法

    模式匹配 在字符串匹配问题中,我们期待察看源串 " S串 " 中是否含有目标串 " 串T " (也叫模式串).其中 串S被称为主串,串T被称为子串. 1.如果在 ...

  6. 《数据结构》之串的模式匹配算法——KMP算法

    //串的模式匹配算法 //KMP算法,时间复杂度为O(n+m) #include <iostream> #include <string> #include <cstri ...

  7. KMP模式匹配算法

    KMP模式匹配算法 相信很多人对于这个还有点不了解,或者说是不懂,下面,通过一道题,来解决软考中的这个问题! 正题: aaabaaa,其next函数值为多少? 对于这个问题,我们应该怎么做呢? 1.整 ...

  8. 线性表-串:KMP模式匹配算法

    一.简单模式匹配算法(略,逐字符比较即可) 二.KMP模式匹配算法 next数组:j为字符序号,从1开始. (1)当j=1时,next=0: (2)当存在前缀=后缀情况,next=相同字符数+1: ( ...

  9. 数据结构- 串的模式匹配算法:BF和 KMP算法

      数据结构- 串的模式匹配算法:BF和 KMP算法  Brute-Force算法的思想 1.BF(Brute-Force)算法 Brute-Force算法的基本思想是: 1) 从目标串s 的第一个字 ...

随机推荐

  1. hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...

  2. Windows Myeclipse 10 安装 Perl 插件

    1.首先安装 windows 下的 perl 环境这里使用 active perl,选择最新版本 5.16.1下载地址:http://www.activestate.com/activeperl/do ...

  3. [POJ3264]Balanced Lineup(RMQ, ST算法)

    题目链接:http://poj.org/problem?id=3264 典型RMQ,这道题被我鞭尸了三遍也是醉了…这回用新学的st算法. st算法本身是一个区间dp,利用的性质就是相邻两个区间的最值的 ...

  4. [NYIST15]括号匹配(二)(区间dp)

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=15 经典区间dp,首先枚举区间的大小和该区间的左边界,这时右边界也可计算出来.首先初 ...

  5. 用vi修改文件,保存文件时,提示“readonly option is set”的解决方法

    来源:http://superuser.com/questions/300500/ubuntu-unable-to-edit-bashrc-file-because-of-readonly This ...

  6. 4 张 GIF 图帮助你理解二叉查找树

    二叉查找树(Binary Search Tree),也称二叉搜索树,是指一棵空树或者具有下列性质的二叉树: 1.任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 2.任意节点的右子树 ...

  7. zoj 3822 Domination (概率dp 天数期望)

    题目链接 参考博客:http://blog.csdn.net/napoleon_acm/article/details/40020297 题意:给定n*m的空棋盘 每一次在上面选择一个空的位置放置一枚 ...

  8. List排序的两种简便方式

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace List ...

  9. tarjan总结

    先说一下割点跟割边吧. 割桥就是如果一个连通图里删除这条边之后,这个图会变成两个连通图,那么这条边就称之为割桥. 这是割桥的代码,里面呆着lca求法. 割点和割桥的就是用一个时间戳和回到祖先确定. 用 ...

  10. Scala List

    1 介绍 Scala中列表List类似于数组,List所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,这意味着一个列表的元素可以不被分配来改变. 第二,列表表示一个链表,而数组平 ...