目前階段:-
累計步驟(steps):0
累計命中數:0
紅色為目前建構/掃描的節點;黃框為建 fail 階段的 BFS 佇列(frontier);綠色為已處理節點;
深綠粗框為命中模式結尾的節點;節點上方文字為該節點的入邊字元(root 為根);goto 邊即 trie 邊。
文本帶中框起的字元為目前掃描游標,綠底為已命中模式覆蓋的字元。
垃圾郵件過濾器要在一封信裡同時抓出上百個違禁詞,如果一個字一個字地重頭找、找一個掃一遍,一百個詞就得把整封信讀一百遍,很慢。Aho-Corasick 的巧思是先把這一百個詞編成一張「關鍵字濾網」,然後整封信只讀過一次,經過每個字時濾網就順手記下所有剛好命中的詞——就像過濾器一次就把水裡各種雜質全篩出來。它靠的是預先建好的兩種「捷徑」(fail 與 output 鏈結),讓比對失敗時不必倒回去重讀。下面你會看到這張濾網怎麼一步步建起來,以及掃描文本時游標如何沿著它同時找出多個模式串。
Aho-Corasick 可以看成 KMP 在 trie 上的推廣:先把所有模式串插入一棵 trie,再用 BFS 幫每個節點建立 fail 鏈結(等同 KMP 的失敗函數,指向「換一條路後最長可續接的前綴」)與 output 鏈結(讓一個節點可以一次帶出多個結尾重疊的模式)。 建好自動機後,只需掃描文本一次(O(n+m+z),m 為所有模式總長、z 為命中數),無邊可走時沿 fail 回退、有邊則前進, 即可同時找出所有模式串的所有出現位置。