• Aho-Corasick 多模式匹配算法、AC自动机详解


    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

  • 相关阅读:
    影院售票系统
    返璞归真
    【C++】【STL】【map】基础知识干货
    书签-技术类
    正则表达式-正则表达式校验金额最多保留两位小数
    winCommand-cmd杀死进程
    idea快捷键-总结
    接口封装-泛型方法、泛型接口、lambda表达式【类似ios传递block】
    treeMap-get返回null,因为比较器出问题
    git-linux一个月更新80万行代码,如何保证项目稳健?
  • 原文地址:https://www.cnblogs.com/gao88/p/6825966.html
Copyright © 2020-2023  润新知