Algorithm Aho-Corasick算法

Algorithm Aho-Corasick算法,algorithm,aho-corasick,Algorithm,Aho Corasick,我无法理解以下使用Aho alg进行字符串模式匹配的算法 程序AC(y,n,q0) 输入:y您可能不会通过阅读一点伪代码来很好地理解Aho-Corasick算法。除非您理解状态转换表,否则该算法将毫无意义 这里有一个像样的解释和一个动画 原始文件(PDF)编写良好,易于理解,伪代码示例很容易转换为工作代码。这需要一点研究,但你应该在阅读论文后有一个很好的理解,想一想,然后再读一遍。Aho-Corasick算法用于解决集匹配问题。这意味着我们有一组字符串S,这里有一个长字符串L来检查L是否包含前一

我无法理解以下使用Aho alg进行字符串模式匹配的算法

程序AC(y,n,q0)

输入:y您可能不会通过阅读一点伪代码来很好地理解Aho-Corasick算法。除非您理解状态转换表,否则该算法将毫无意义

这里有一个像样的解释和一个动画


原始文件(PDF)编写良好,易于理解,伪代码示例很容易转换为工作代码。这需要一点研究,但你应该在阅读论文后有一个很好的理解,想一想,然后再读一遍。

Aho-Corasick算法用于解决集匹配问题。这意味着我们有一组字符串S,这里有一个长字符串L来检查L是否包含前一组S中的任何一个

基本解决方案是使用trie树,即前缀树,请参阅。处理该问题通常有两个步骤

  • 基于字符串集S预计算trie树
  • 扫描字符串L以进行检查
  • trie树很容易理解。它存储前缀子字符串,其中节点从根开始

    Aho-Corasick算法是trie树的扩展,离基本思想不远Aho Corasick算法向trie树上的每个节点添加一个失败的指针。

    失败时,trie树将从根重新启动(将L上的开始索引添加到1),但Aho Corasick算法将从失败指针指向的节点D重新启动(将L上的开始索引添加到节点D的深度)

    是Aho Corasick算法的C++实现。它包含一些bug。

    我修复了我发现的错误。您可以在此处访问我的版本:
    什么是
    f
    g
    o
    ?这看起来像是一个状态机的一般实现,它根据输入的每个新字符更新当前状态,然后确定字符串是否以接受状态结束。我已经在幻灯片上提供了关于Aho Corasick的演讲稿,对于任何可能认为它们有用的人:aho-corasick算法的优点是什么?优点是它可以在一次遍历大量文本的过程中匹配多个字符串,而使用类似于Boyer-Moore搜索的方法单独搜索字符串则需要对文本进行多次遍历。阅读和引用的链接。如果没有这些算法,我们该怎么办?