最近學習模式匹配知識,了解了kmp與bm演算法後,ac的了解也必不可少。上網學習了下,把重要的知識總結一下。
aho_corasick自動機匹配演算法是最著名的多模式匹配演算法之一。
ac自動機演算法分為3步:構造一顆trie樹,構造失敗指標和模式匹配過程。
1.建立一顆trie的過程比較簡單(可參考源**)
2.構造失敗指標
構造失敗指標的過程概括起來就一句話:設這個節點上的字母為
c,沿著他父親的失敗指標走,直到走到乙個節點,他的兒子中也有字母為
c的節點。然後把當前節點的失敗指標指向那個字母也為
c的兒子。如果一直走到了
root
都沒找到,那就把失敗指標指向
root。
3.模式匹配過程
匹配過程分兩種情況:
(1)當前字元匹配,表示從當前節點沿著樹邊有一條路徑可以到達目標字元,此時只需沿該路徑走向下乙個節點繼續匹配即可,目標字串指標移向下個字元繼續匹配;
(2)當前字元不匹配,則去當前節點失敗指標所指向的字元繼續匹配,匹配過程隨著指標指向root結束。
下面給出ac演算法的具體c++實現:
#include
#include
#include
using namespace std;
const int maxn = 1000001; //模式串的最大長度maxn - 1
const int maxm = 51; //單詞最大長度為maxm - 1
const int keysize = 26; //26個小寫字母
struct node
}*q[maxn / 2];
void insert(char *str, node *root)
p -> count ++; //在單詞的最後乙個結點count + 1,代表乙個單詞
}void build_ac_automation(node *root)
else
p = p -> fail;
}if(p == null)
temp -> next[i] -> fail = root;
}q[tail ++] = temp -> next[i];}}
}}int ac_search(char *str, node *root)
i ++;
}return cnt;
}int main()
build_ac_automation(root);
printf("scanf the text-->\n");
scanf("%s", str);
printf("there are %d words match\n", ac_search(str, root));
return(0);
}
多模式匹配AC演算法
aho corasick演算法是多模式匹配中的經典演算法,目前在實際應用中較多。aho corasick演算法對應的資料結構是aho corasick自動機,簡稱ac自動機。搞程式設計的一般都應該知道自動機fa吧,具體細分為 確定性有限狀態自動機 dfa 和非確定性有限狀態自動機nfa。普通的自動機...
AC多模式匹配演算法
本來想寫字串匹配演算法的,感覺題目太大 又想寫個多模式匹配演算法的,感覺還是太大 最後,寫了個ac多模式匹配演算法,對哦,我只用到了ac演算法啊,不過其他演算法還是會介紹一下的,了解多少介紹多少。本人是為了總結,所以可能不遵守一些寫作邏輯了哦。字串匹配,主要分兩種情況。一種是單字串匹配,另一種是多字...
多模式匹配AC演算法(更正)
上篇中的執行結果如下 不仔細看完全沒有問題,可是如果細心的你仔細看下對字串 hao 的匹配的下標時就會發現問題了.下圖為更正 後的結果 經過兩個的對比,應該很明顯了吧。廢話不多說,以下是需要更改的函式的 int searchac tree root,char str,int len treenode...