多模式匹配AC演算法

2021-07-12 00:19:21 字數 2448 閱讀 3516

aho-corasick演算法是多模式匹配中的經典演算法,目前在實際應用中較多。

aho-corasick演算法對應的資料結構是aho-corasick自動機,簡稱ac自動機。

搞程式設計的一般都應該知道自動機fa吧,具體細分為:確定性有限狀態自動機(dfa)和非確定性有限狀態自動機nfa。普通的自動機不能進行多模式匹配,ac自動機增加了失敗轉移,轉移到已經輸入成功的文字的字尾,來實現。

1.多模式匹配

多模式匹配就是有多個模式串p1,p2,p3...,pm,求出所有這些模式串在連續文字t1....n中的所有可能出現的位置。

例如:求出模式集合在給定文字"sdmfhsgnshejfgnihaofhsrnihao"中所有可能出現的位置

2.aho-corasick演算法

使用aho-corasick演算法需要三步:

1.建立模式的trie

2.給trie新增失敗路徑

3.根據ac自動機,搜尋待處理的文字

下面說明這三步:

2.1建立多模式集合的trie樹

trie樹也是一種自動機。對於多模式集合,對應的trie樹如下,其中紅色標記的圈是表示為接收態:

2.2為多模式集合的trie樹新增失敗路徑,建立ac自動機

構造失敗指標的過程概括起來就一句話:設這個節點上的字母為c,沿著他父親的失敗指標走,直到走到乙個節點,他的兒子中也有字母為c的節點。然後把當前節點的失敗指標指向那個字母也為c的兒子。如果一直走到了root都沒找到,那就把失敗指標指向root。

使用廣度優先搜尋bfs,層次遍歷節點來處理,每乙個節點的失敗路徑。  

特殊處理:第二層要特殊處理,將這層中的節點的失敗路徑直接指向父節點(也就是根節點)。

2.3根據ac自動機,搜尋待處理的文字

從root節點開始,每次根據讀入的字元沿著自動機向下移動。

當讀入的字元,在分支中不存在時,遞迴走失敗路徑。如果走失敗路徑走到了root節點,則跳過該字元,處理下乙個字元。

因為ac自動機是沿著輸入文字的最長字尾移動的,所以在讀取完所有輸入文字後,最後遞迴走失敗路徑,直到到達根節點,這樣可以檢測出所有的模式。

3.aho-corasick演算法**示例

模式串集合:

待匹配文字:"sdmfhsgnshejfgnihaofhsrnihao"

**如下:

#include#include#include#includeusing namespace std;

typedef struct node

*tree,treenode;

char pattern[4][30]=;

//申請新節點,並進行初始化

treenode *getnewnode()

//將trie樹中,root節點的分支節點放入佇列

int nodetoqueue(tree root,queue&myqueue)

//建立trie樹

tree buildingtree()

else

tmp1=tmp1->next[ pattern[i][j]-'a' ];

} tmp1->pattertag=1;

tmp1->patterno=i;

} return root;

}//建立失敗指標,使用廣搜bfs層次遍歷節點來處理每乙個節點的失敗路徑

int buildingfailpath(tree root)

} tree tmp=null,par=null;

while(!myqueue.empty())

else

else

par=par->fail->par;

}} }

return 0;

}//進行多模式搜尋,即搜尋ac自動機

int searchac(tree root,char *str,int len)

free(tmp);

} return 0;

}int main()

{ char a="sdmfhsgnshejfgnihaofhsrnihao";

tree root=buildingtree();

buildingfailpath(root);

cout<

AC多模式匹配演算法

本來想寫字串匹配演算法的,感覺題目太大 又想寫個多模式匹配演算法的,感覺還是太大 最後,寫了個ac多模式匹配演算法,對哦,我只用到了ac演算法啊,不過其他演算法還是會介紹一下的,了解多少介紹多少。本人是為了總結,所以可能不遵守一些寫作邏輯了哦。字串匹配,主要分兩種情況。一種是單字串匹配,另一種是多字...

多模式匹配AC演算法(更正)

上篇中的執行結果如下 不仔細看完全沒有問題,可是如果細心的你仔細看下對字串 hao 的匹配的下標時就會發現問題了.下圖為更正 後的結果 經過兩個的對比,應該很明顯了吧。廢話不多說,以下是需要更改的函式的 int searchac tree root,char str,int len treenode...

AC自動機(多模式匹配)

ac自動機主要解決的問題 多模式匹配 kmp則屬於單模式匹配 n個單詞在m個字元的文章中,出現過多少次。主要分三步 構建trie樹 構建失敗指標 尋找匹配個數 trie樹 又稱字典樹 單詞查詢樹,是一種樹形結構,用於儲存大量的字串。它的優點是 利用字串的公共字首來節約儲存空間。具體參見 失敗指標 作...