1. 程式人生 > >【算法】後綴自動機SAM

【算法】後綴自動機SAM

同時 一個 自動 ... 包含 結合 不存在 相交 bsp

【Right集合】

後綴自動機真正優於後綴樹的方面在於:結合了有限狀態自動機,從而實現了O(n)的時空復雜度。

trans(s,str)表示s+str到達的狀態。

ST(str)=trans(init,str)即包括了str這一子串的唯一狀態(一個子串只能屬於一個狀態)

定義字符串a在S中出現的右端點位置集合Right(a)=r1,r2...rn

SAM中一個狀態s的Right集合為Right(s),那麽狀態s表示所有[Right(a)=Right(s)的子串a],那麽實際上狀態s表示的子串a的長度在一個區間內,記作[Min(s),Max(s)]。字符串越短,Right集合越大。

容易證明對於任意狀態a和b,Right(a)和Right(b)要麽包含要麽不相交。(很顯然的結論,只是論文的證明比較嚴格化)

★在後綴自動機中,一個狀態s(或稱“節點s”)表示的是Right(a)=Right(s)的若幹子串a,其長度區間為[MIn(s),Max(s)],從而達到狀態數O(n)的目的。

Right集合形成的樹形包含關系稱為Parent Tree,樹邊由孩子指向父親,是SAM中的失配邊。

Parent樹從上往下,子串長度擴大,Right集合變小,父節點的Right集合包含子節點的Right集合

fa=Parent(s)當且僅當fa是使Right(fa)最小且滿足Right(s)?Right(fa)的結點,(從兒子到父親,就是子串稍微縮短,Right集合變大)

另有Max(fa)=Min(s)-1,實質上是要求fa和s之間沒有一個Right子集x滿足Right(s)?Right(x)?Right(fa)。

【線性構造SAM】

線性構造采用增量法,即已知字符串T的SAM(T),L=Len(T),在末尾加入字符x,構造SAM(Tx),轉移如下:

①實邊轉移規則:t=trans(s,x)表示s--->t標號為x的邊,若Right(s)={r1,r2...rn},則Right(t)={ri+1|s[ri+1]=x}

②虛邊轉移規則:Parent樹邊滿足Right(s)?Right(fa),Max(fa)=Min(s)-1(含義如上所述)

加入x,考慮所有Right集合包含L的結點v1,v2...vk,顯然它們在Parent樹上是一條從根到葉子的鏈。

定義葉子結點v1=p=ST(T)(即p代表整個串),Right(p)={L},不妨它們從後代到祖先排為v1=p...vk=root。

同時新建結點np=ST(Tx),Right(np)={L+1}。

考慮節點v,Right(v)={r1,r2...rn=L}

根據轉移規則①,如果除了rn外不存在S[ri+1]=x,那麽節點v不存在trans(v,x)。

根據轉移規則②,越往上Right集合逐漸擴大直至節點vp存在trans(vp,x),那麽v1~vp-1只須向np連出標號為x的邊(np=trans(v,x)),而vp~vk都已經存在trans(v,x)。

令trans(vp,x)=q,當Max(q)=Max(vp)+1時,只須在q的Right集合中插入L+1。

下面重點討論Max(q)>Max(vp)+1的情況。

【算法】後綴自動機SAM