我无法理解下面使用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
答案 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。通常有两个步骤来处理这个问题。
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