Aho Corasick算法

时间:2013-12-02 13:00:21

标签: algorithm aho-corasick

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

Procedure AC(y,n,q0)
INPUT: y<-array of m bytes representing the text input
(SQL Query Statement)
n<-integer representing the text length
(SQL Query Length)
q0<-initial state (first character in pattern)
2: State <-q0
3: For i = 1 to n do
4: While g ( State, y[i] = = fail) do
5: State ← f (State)
6: End While
7: State ← g(State,.y[i])
8: If o(State)  then
9: Output i
10: Else
11: Output
12: End If
13: End for
14: End Procedure

2 个答案:

答案 0 :(得分:26)

通过阅读一点伪代码,您可能无法很好地理解Aho-Corasick算法。除非您了解状态转换表,否则算法根本没有意义。

Aho-Corasick implementation and animation处有一个不错的解释和动画。

原始论文Efficient String Matching: An Aid to Bibliographic Search(PDF)编写得很好且易于理解,伪代码示例很容易转换为工作代码。这需要一点点研究,但是在阅读完论文之后你应该有一个很好的理解,稍微考虑一下,然后再读一遍。

答案 1 :(得分:7)

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

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

  1. 根据字符串集S;
  2. 预先计算trie树
  3. 扫描字符串L以进行检查。
  4. trie树很容易理解。它存储带有节点的前缀子串从根开始。

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

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

    下面是Aho-Corasick算法的C ++实现。它包含一些错误。 http://www.komodia.com/aho-corasick

    我修复了我发现的错误。你可以在这里访问我的版本: https://github.com/elfinhe/KomodiaAhoCorasick