AC演算法初探

2021-07-04 14:45:51 字數 2990 閱讀 4778

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...