AC演算法原理與實現(模式匹配)

2021-06-27 02:37:33 字數 1411 閱讀 4098

最近學習模式匹配知識,了解了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...