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樹 又稱字典樹 單詞查詢樹,是一種樹形結構,用於儲存大量的字串。它的優點是 利用字串的公共字首來節約儲存空間。具體參見 失敗指標 作...