標籤:字典序 pre 計算 div log dia 技術分享 ges wiki
參考:
Suffix array - Wiki
尾碼數組(suffix array)詳解
6.3 Suffix Arrays - 演算法紅寶書
Suffix Array 尾碼數組
基本概念
應用:字串處理、生物資訊序列處理
尾碼:學過英語的都知道什麼叫尾碼,就是從某個位置開始到字串結尾的特殊子串,記住 Suffix(i)=S[i...len(S)-1],i就是尾碼起始位置
尾碼數組:就是將尾碼排序好後放到一個一維數組裡,SA[i]存放排名第i大的尾碼首字元下標,並且保證 Suffix(SA[i])<Suffix(SA[i+1]), 1<=i<n 。
Rank數組:rank[i]存放suffix(i)的優先順序
註:尾碼數組和Rank數組為互逆運算。我們只要算出了sa數組,就可以在O(n)的時間複雜度內算出rank數組。
height數組:height[i]儲存的是suffix(i)和suffix(i-1)的最長公用首碼的長度。也就是排名相鄰的兩個尾碼的最長公用首碼。
看圖說話:
下面列出了aabaaaab的所有尾碼,並對其標號1..8
構造Rank數組,對每個i一次計算其尾碼的排名,如下第一個尾碼排名第4,所以Rank數組第一個為4
怎麼構造尾碼數組
構造sa數組
構造rank數組
構造height數組
例子
aabaaaab
總共有n=8個尾碼:
1: aabaaaab2: abaaaab3: baaaab4: aaaab5: aaab6: aab7: ab8: b
按照字典序排序後
sa[ 1 ] = 4 aaaabsa[ 2 ] = 5 aaabsa[ 3 ] = 6 aabsa[ 4 ] = 1 aabaaaabsa[ 5 ] = 7 absa[ 6 ] = 2 abaaaabsa[ 7 ] = 8 bsa[ 8 ] = 3 baaaab
rank數組為:
rank[1]=4rank[2]=6rank[3]=8rank[4]=1rank[5]=2rank[6]=3rank[7]=5rank[8]=7
height數組為:
height[ 1 ]=nullheight[ 2 ]= 3height[ 3 ]= 2height[ 4 ]= 3height[ 5 ]= 1height[ 6 ]= 2height[ 7 ]= 0height[ 8 ]= 1
因此,所有子串的最長公用子串就是3.
尾碼數組(suffix array)