ac演算法初探
一、什麼是ac演算法
ac演算法,即aho-corasick自動機演算法。 該演算法一次遍歷原串便可定位所有模式串在原串中出現的位置。該演算法通過所有的模式串構建乙個有限狀態自動機,然後用這個自動機去處理原串(只要一次遍歷即可);
二、ac演算法流程
ac演算法總共由三部分組成,分別是a) goto函式 b) failure 函式 c) output 函式
舉個例子,設模式串組為 原串為「ushers」
下面直接給出goto函式表、 failure函式表以及output函式表
a) goto函式表
b)failure函式表
i 1 2 3 4 5 6 7 8 9
f(i) 0 0 0 1 2 0 3 0 3
c)output函式表
i output(i)
2
5
7
9
下面開始匹配,原串"ushers"
起始狀態為0;g(s, a) == fail表示失配
偽**:
設原串為a1a2...an
begin
state
for i
begin
while g(state, ai)==fail do state
state
if output(state) != empty then
begin
print i
print output(state)
endend
end
三、 goto函式、 failure函式以及output函式的構造
a) goto函式
/** goto 函式的構造
* 輸入: 模式串組
* 輸出: g函式 和 部分構造的output函式
* 方法: 當s賦初值時, output(s) == empty
* 當a沒有被定義,或是g(s, a)沒有被定義時, g(s, a) == fail
*
*/ begin
newstate
for i
/* 起始狀態的fail都置0 */
for all a (maybe a, b, c, ..., z) such that g(0, a) == fail do g(0, a)
end
procedure enter(a1a2...am):
begin
state
while g(state, aj) != fail
begin
state
j end
for p
begin
newstate
g(state, ap)
state
endoutput (state)
end
b) failure函式構造
/** failure函式構造
* 輸入: goto函式 以及 部分構造的output函式
* 輸出: failure函式 和 output函式
* **/
begin
queue
/* 第一層的failure函式值置0 */
for each a such that g(0, a) == s !=0 do
begin
queue
f(s)
endwhile queue != empty do
begin
/* 從佇列中取出乙個元素r */
let r be the next state in queue
queue
for each a such that g(r, a) == s != fail do
begin
queue
state
while g(state, a) == fail do state
f(s)
output(s)
endend
end
四、非確定有限狀態自動機確定化
在ac流程中,當g(r, a) == fail時, 可能需要查詢多次failure表,像這樣的不確定給識別帶來的反覆,無疑會影響自動機工作的效率。
/** 構造確定有限狀態自動機
* 輸入: goto函式 和 failure函式
**/begin
queue
for each symbol a do
begin
δ(0, a)
if g(0, a) != 0 then queue
endwhile queue != empty do
begin
let r be the next state in queue
queue
for each symbol a do
if g(r, a) ==s != fail do
begin
queue
δ(r, a)
endelse
δ(r, a)
endend
參考:《efficient string matching: an aid to bibliographic search》 AC自動機初探
ac自動機是kmp kmpkm p和trie trie trie 的結合,它處理了單串匹配多模式串的問題。之所以這麼因為它引入了fai lfail fail 指標處理相同字尾的資訊,利用tri etrie trie 處理多模式串的問題。從trie的0結點開始往外延伸,對於每個結點都有自己的指標指向自...
AC演算法思想
多模式匹配ac演算法的核心仍然是尋找模式串內部規律,達到在每次失配時的高效跳轉。這一點與單模式匹配kmp演算法和bm演算法是一致的。不同的是,ac演算法尋找的是模式串之間的相同字首關係。ac演算法的核心是三張查詢表 goto failure和output,共包含四種具體的演算法,分別是計算三張查詢表...
DFS演算法初探
我的理解就是找一條路一直走到黑,不行就一步步回退。常用遞迴來實現 下面用幾道題目進行理解 include include const int maxn 100 int mat maxn maxn vis maxn maxn char s maxn int n void dfs int x,int y...