Aho-Corasick

Aho-Corasick(AC 自動機)是多模式字串匹配演算法。
適合在一段長文字中,同時搜尋大量關鍵詞(patterns)。

核心觀念:


為什麼需要 Aho-Corasick

若有 k 個 pattern,逐一用單模式比對(例如 KMP)會重複掃描 text。

Aho-Corasick 可以把多模式合併成一個自動機,
主字串在攤銷意義下通常只需線性掃描一次。


結構組成

1) Trie

當目前字元無法沿 Trie 繼續時,
沿 failure link 跳到最長可用後綴對應節點。

這個想法與 KMP, Knuth-Morris-Pratt 的失敗回退概念相近,
只是從單一 pattern 擴展到整個 Trie。

3) Output

每到一個節點,輸出該節點所對應的所有匹配;
這些匹配可由自身與 failure 鏈繼承而來。

註:有些實作會先把 failure 節點的輸出預先合併到當前節點,
查詢時可直接讀當前 output,不必每次沿 failure 鏈逐層回溯。


搜尋流程(概念)

  1. 先把所有 pattern 建成 Trie
  2. 用 BFS 建立每個節點的 failure link
  3. 掃描 text:
    • 若可轉移,前進
    • 若不可轉移,沿 failure link 跳轉
    • 讀取當前節點 output(可能已含 failure 繼承結果)

複雜度

設:

常見複雜度:

因此整體常寫成近似線性:
O(N + L + Z)


什麼情境特別適合


和 KMP 的差異

若只有一個 pattern,KMP 通常更簡潔;
若 pattern 很多,Aho-Corasick 優勢明顯。


限制與注意事項


相關筆記


Reference

Powered by Forestry.md