專利名稱:后綴數(shù)組構造方法
技術領域:
本發(fā)明涉及一種字符串后綴數(shù)組構造方法,尤其涉及一種通過計算機在線性時間 內自動完成字符串后綴數(shù)組構造的方法。
背景技術:
字符串后綴數(shù)組是后綴樹的一個節(jié)省空間的替代型數(shù)據(jù)結構,最先由Manber和 Myers在文獻1,2中提出,可以在更小的空間內實現(xiàn)等同后綴樹的算法。后綴數(shù)組在數(shù)據(jù) 索引和模式匹配等應用中有廣泛用途。本文發(fā)明了一個新的后綴數(shù)組構造算法,可在線性 時間內為任意給定的字符串構造其后綴數(shù)組。在本文的陳述中用到以下術語。字符集一個字符集Σ是一個建立了全序關系的集合,即Σ中任意兩個不同的元素 α和β都可以比較大小,要么α < β,要么α > β。字符集Σ中的元素稱為字符,其中 最小的字符為‘$’。本文所涉及的字符集大小假設為一個常數(shù)0(1)。字符串一個長度為η的字符串S是將η個屬于字符集Σ中的字符按其位置依次排 列形成的數(shù)組s
,S的結束符固定為‘$’,并且‘$’不在S中的其它位置出現(xiàn)。子串字符串S的子串S[i. . j], i ^ j,表示S串中從位置i到位置j的一段字符 串,也就是由字符s[i],S[i+1],. . .,S[j]組成的字符串。后綴字符串S的一個后綴是指從某個位置i開始到結束符$的一個子串。從第i 個字符開始的后綴表示為suf (S,i),也就是suf (S,i) = S[i..n_l]。字符和后綴類型S中的字符分為L和S兩種類型1) ‘$,為 S 類型;2)S[i],i e [1,n-1]為 S 類型,當且僅當 suf(S,i) < suf (S, i+1),即 S[i] < S[i+1]或者 S[i] = S[i+1]且 S[i+1]為 S 型。3)S[i],i e [1,n-1]為 L 類型,當且僅當 suf (S, i) > suf (S, i+Ι),即 S[i] > S[i+1]或者 S[i] = S[i+1]且 S[i+1]為 L 型·’4)后綴suf (S,i)是S類型當且僅當字符S[i]為S類型;后綴suf (S,i)是L類 型當且僅當字符S[i]為L類型。LMSdeftmost S-type,最左S類型)字符和后綴1) ‘$’為 LMS 字符;2)S[i],i e [l,n-l]為LMS字符,當且僅當S[i]為S類型且S[i_l]為L類型;3)后綴suf (S,i)是LMS后綴當且僅當字符S [i]為LMS字符。LMS 子串1) ‘$’為 LMS 子串;2)S[i.. j]為LMS子串,當且僅當1彡i < j <n,S[i]禾Π S[j]同為LMS字符,且 S[i]和S[j]之間不存在其他LMS字符。指針數(shù)組指針數(shù)組Pl記錄字符串S中所有LMS子串的首字母所在的位置,即Pl [i]記錄字符串S中(從左到右)第i+Ι個LMS子串的首字母在S中的位置。字符串大小比較兩個字符串的大小比較,是指通常所說的“字典順序”比較,亦即 對于兩個字符串u和V,令i從0開始順次比較u[i]和v[i]。如果u[i] = v[i]則令i加 1再繼續(xù)比較下一個u[i]和v[i],否則若u[i] <v[i]則認為u<v,或者u[i] >v[i]則
認為U > Vo后綴數(shù)組S的后綴數(shù)組SA是一個包含η個整數(shù)的一維數(shù)組,對于i e
滿 足SUf (S,SA [i]) <suf(S,SA[i+l])。也就是將S的η個后綴從小到大進行排序之后把排 好序的各后綴首字母在S中的位置從左到右順次放入SA中。利用以上術語,我們給出一個構造字符串后綴數(shù)組的例子如下。字符串 S = baac$,其長度 η = 5,suf (S,0) = baac$, suf (S, 1) = aac$, suf (S, 2) = ac$, suf (S, 3) = c$, suf (S, 4) = $。根據(jù)字符串大小比較的定義容易知道suf (S, 4) < suf (S, 1) < suf (S,2) < suf (S, 0) < suf (S,3)。再根據(jù)后綴數(shù)組的定義,容易得出 SA
= 4,SA[1] = 1,SA[2] = 2,SA[3] = 0,SA[4] = 3,即 SA = [4,1,2,0,3]?,F(xiàn)存有多種構造字符串后綴數(shù)組的計算機算法,參見文獻1-8。按這些算法的時 間復雜度來分類,可以分為線性時間或超線性時間兩大類。其中線性時間算法的定義為給 定一個字符集Σ上長度為η的字符串,即該字符串包含η個屬于字符集Σ中的字符,對該字 符串中η個后綴進行排序的時間復雜度為Ο(η)?,F(xiàn)存的線性時間后綴數(shù)組構造算法存在實 際運行速度慢、空間復雜度大的缺點3,4,5,7,8,限制了它們在實踐中的運用。參考文獻1)U. Manber and G. Myers, "Suffix arrays :A new method for online string searches,,,inProceedings of SODA, 1990, pp. 319-327.2)U. Manber and G. Myers, "Suffix arrays :A new method for on-line string searches,,,SIAMJournal on Computing, vol. 22, no. 5, pp. 935-948,1993.3)D. K. Kim, J. S. Sim, H. Park, and K. Park, "Linear-time construction of suffix arrays, "inProceedings of CPM,2003, pp.186-199.4)P. Ko and S. Aluru,"Space-efficient linear time construction of suffix arrays, " Journal ofDiscrete Algorithms,vol. 3,no.2-4,pp.143-156, 2005.5)J.Karkkainen, P. Sanders, and S. Burkhardt, "Linear work suffix array construction, "JACM, no.6,pp.918—936,Nov. 2006.6)G. Manzini and P.Ferragina, "Engineering a lightweight suffix array construction algorithm,,,Algorithmica, vol. 40, no. 1, pp. 33-50, Sep. 2004.7) S. J. Puglisi, W. F. Smyth, and A. H. Turpin, "A taxonomy of suffix array construction algorithms,,,ACM Comput. Surv. , vol. 39, no. 2, pp. 1-31, 2007.8)S. J. Puglisi, W. F.Smyth, and A. Turpin, "The performance of linear time suffix sorting algorithms," in Proceedings of Data Compression Conference, Mar. 2005,pp.358-367.
發(fā)明內容
針對以上的不足,本發(fā)明提出了一個新型的線性時間后綴數(shù)組構造方法,它包括步驟1)標記字符串中每個字符和后綴的類型從右向左掃描一遍字符串S,按照 后綴類型的定義比較當前掃描的兩個相鄰字符s[i]和S[i+1],得出每一個字符和后綴的 類型,用數(shù)組t來記錄;步驟2)從左向右掃描一遍數(shù)組t,找出所有LMS字符出現(xiàn)的位置,從而獲取所有 LMS子串的首字母指針,用Pl來記錄每一個LMS子串的指針;步驟幻通過LMS子串指針數(shù)組P1、數(shù)組B和SA來對S中所有的LMS子串進行排 序;步驟4)根據(jù)步驟3)排序的結果重新命名字符串S中的各個LMS子串,形成一個 縮短了的新串Sl ;步驟5)如果Sl的每個字符都是唯一的,則直接排序Sl的各后綴來計算Sl的后 綴數(shù)組SAl,否則以Sl和SAl作為輸入?yún)?shù)遞歸調用SA-IS算法,即SA-IS (Si,SAl);步驟6)根據(jù)步驟幻中獲得的Sl的后綴數(shù)組SAl歸納計算S的后綴數(shù)組SA ;步驟7)返回。所述步驟3)中對S中所有LMS子串進行排序的過程包括31)初始化SA的所有元素為-1,找出S中所有后綴在SA中所屬各桶的結束位置, 從左向右掃描S —次,依次把掃描到的LMS后綴填入其在SA中所屬桶的當前結束位置,然 后再把該桶的結束位置向左移動一格;32)找出S中所有后綴在SA中所屬各桶的起始位置,從左向右掃描SA數(shù)組,對于 掃描到的每個不為"I的元素SA[i],如果S[SA[i]-l]是L型,則把SA[i]-l這個數(shù)值填入 suf (S, SA[i]-l)這個后綴在SA中所屬桶的當前起始位置,然后再把該桶的起始位置向右 移動一格;33)找出S中所有后綴在SA中所屬各桶的結束位置,從右向左掃描SA數(shù)組,對 于掃描到的每個元素SA[i],如果S[SA[i]-l]是S型,則把SA[i]-l這個數(shù)值填入suf (S, SA[i]-l)這個后綴在SA中所屬桶的當前結束位置,然后再把該桶的結束位置向左移動一 格,其中,把字符串S的所有后綴按其第一個字符在數(shù)組SA中進行排序,則所有第一 個字符相同的后綴都連續(xù)的排列在SA中的某一段區(qū)域,這段區(qū)域我們稱之為對應這些后 綴的一個桶。所述步驟4)中計算新字符串Sl的過程包括41)從左向右掃描SA數(shù)組中已排序的所有LMS子串,依次比較相鄰的兩個LMS子 串的大小,被比較的LMS子串從0開始編號命名,如果兩個LMS子串相等,則編號一樣,否則 后者編號等于前者的編號加1 ;42)把S中LMS子串用其在步驟41)中獲取的編號來代替,所形成的新字符串即為 Si。 所述步驟6)中從SAl歸納計算SA的步驟包括 61)初始化SA的所有元素為-1,找出S中所有后綴在SA中所屬各桶的結束位置, 從右向左掃描SAl數(shù)組,對每個掃描到的元素SAl [i],則把Pl [SAl [i]]放在后綴suf (S, Pl[SAl[i]])在SA中所屬桶的當前結束位置,然后再把該桶的結束位置向左移動一格;
62)找出S中所有后綴在SA中所屬各桶的起始位置,從左向右掃描SA數(shù)組,對于 掃描到的每個不為"I的元素SA[i],如果S[SA[i]-l]是L型,則把SA[i]-l這個數(shù)值填入 suf (S, SA[i]-l)這個后綴在SA中所屬桶的當前起始位置,然后再把該桶的起始位置向右 移動一格;63)找出S中所有后綴在SA中所屬各桶的結束位置,從右向左掃描SA數(shù)組,對 于掃描到的每個元素SA[i],如果S[SA[i]-l]是S型,則把SA[i]-l這個數(shù)值填入suf (S, SA[i]-l)這個后綴在SA中所屬桶的當前結束位置,然后再把該桶的結束位置向左移動一 格。本發(fā)明的有益效果利用本發(fā)明可以在線性時間O(n)內對長度為η的字符串構造 其后綴數(shù)組,相比現(xiàn)存的其他線性時間后綴數(shù)組構造方法,本發(fā)明方法具有運行速度快、耗 用空間小、容易實現(xiàn)的優(yōu)點。
圖1為本發(fā)明的后綴數(shù)組構造方法的流程圖。
具體實施例方式下面結合附圖對本發(fā)明進行進一步闡述。如圖1所示,本發(fā)明提出一個新型的線性時間后綴數(shù)組構造方法(SA-IS),可以有 效克服現(xiàn)存線性時間后綴數(shù)組構造算法的缺點,該流程圖中各步驟的偽代碼給出如下,其 中每個數(shù)組的元素以從左到右的方式存儲,即第一個元素在最左邊,最后一個元素在最右 邊。SA-IS (S, SA)S 輸入字符串;(長度為η個字符,包含nl個LMS子串)SA: S的后綴數(shù)組;Sl 整型數(shù)組;(記錄對S中各LMS子串重命名后形成的新字符串,長度為nl)SAl =Sl的后綴數(shù)組t 布爾數(shù)組;(記錄S中每個字符的類型,長度為η)Pl 整型數(shù)組;(記錄S中各LMS子串出現(xiàn)的位置,長度為nl)B:整型數(shù)組;(排序時用到的輔助數(shù)組,長度為Μ Σ (S) I I (即字符集Σ中元素的 個數(shù)))步驟1)標記字符串中每個字符和后綴的類型。從右向左掃描一遍字符串S,按照 后綴類型的定義比較當前掃描的兩個相鄰字符s[i]和S[i+1],得出每一個字符和后綴的 類型,用數(shù)組t來記錄;步驟2)從左向右掃描一遍數(shù)組t,找出所有LMS字符出現(xiàn)的位置,從而獲取所有 LMS子串的首字母指針,用Pl來記錄每一個LMS子串的指針;步驟幻通過LMS子串指針數(shù)組P1、數(shù)組B和SA來對S中所有的LMS子串進行排 序;步驟4)根據(jù)步驟3)排序的結果重新命名字符串S中的各個LMS子串,形成一個 縮短了的新串Sl ;
步驟5)如果Sl的每個字符都是唯一的,則直接排序Sl的各后綴來計算Sl的后 綴數(shù)組SAl,否則以Sl和SAl作為輸入?yún)?shù)遞歸調用SA-IS算法,即SA-IS (Si,SAl);步驟6)根據(jù)步驟幻中獲得的Sl的后綴數(shù)組SAl歸納計算S的后綴數(shù)組SA ;步驟7)返回。下面對步驟;3)、4)和6)的細節(jié)進行進一步描述,為方便敘述,首先介紹一個“桶” 的概念,把字符串S的所有后綴按其第一個字符在數(shù)組SA中進行排序,則所有第一個字符 相同的后綴都連續(xù)的排列在SA中的某一段區(qū)域,這段區(qū)域我們稱之為對應這些后綴的一 個桶。如果S中包含有m個不同的字符,則SA中會形成m個桶,每個桶中所包含的后綴的 首字符都相同。如果一個桶所包含的后綴的首字符為‘y’,我們也簡稱該桶為字符 桶。 另外,當我們說把一個后綴放入SA中的一個單元,其含義是在SA中該單元記錄此后綴在S 中的位置。步驟3)中對S中所有LMS子串進行排序的過程步驟描述如下31)初始化SA的所有元素為-1 ;找出S中所有后綴在SA中所屬各桶的結束位置; 從左向右掃描S —次,依次把掃描到的LMS后綴填入其在SA中所屬桶的當前結束位置,然 后再把該桶的結束位置向左移動一格;32)找出S中所有后綴在SA中所屬各桶的起始位置;從左向右掃描SA數(shù)組,對于 掃描到的每個不為"I的元素SA[i],如果S[SA[i]-l]是L型,則把SA[i]-l這個數(shù)值填入 suf (S, SA[i]-l)這個后綴在SA中所屬桶的當前起始位置,然后再把該桶的起始位置向右
移動一格。33)找出S中所有后綴在SA中所屬各桶的結束位置;從右向左掃描SA數(shù)組,對 于掃描到的每個元素SA[i],如果S[SA[i]-l]是S型,則把SA[i]-l這個數(shù)值填入suf (S, SA[i]-l)這個后綴在SA中所屬桶的當前結束位置,然后再把該桶的結束位置向左移動一 格。步驟4)中計算新字符串Sl的步驟如下41)從左向右掃描SA數(shù)組中已排序的所有LMS子串,依次比較相鄰的兩個LMS子 串的大??;被比較的LMS子串從0開始編號命名,如果兩個LMS子串相等,則編號一樣,否則 后者編號等于前者的編號加1 ;42)把S中LMS子串用其在步驟4. 1中獲取的編號來代替,所形成的新字符串即為 Si。步驟6)中從SAl歸納計算SA的流程如下61)初始化SA的所有元素為-1 ;找出S中所有后綴在SA中所屬各桶的結束位置; 從右向左掃描SAl數(shù)組,對每個掃描到的元素SAl [i],則把Pl [SAl [i]]放在后綴suf (S, Pl[SAl[i]])在SA中所屬桶的當前結束位置,然后再把該桶的結束位置向左移動一格;62)找出S中所有后綴在SA中所屬各桶的起始位置,從左向右掃描SA數(shù)組,對于 掃描到的每個不為"I的元素SA[i],如果S[SA[i]-l]是L型,則把SA[i]-l這個數(shù)值填入 suf (S, SA[i]-l)這個后綴在SA中所屬桶的當前起始位置,然后再把該桶的起始位置向右 移動一格;63)找出S中所有后綴在SA中所屬各桶的結束位置,從右向左掃描SA數(shù)組,對 于掃描到的每個元素SA[i],如果S[SA[i]-l]是S型,則把SA[i]-l這個數(shù)值填入suf (S,SA[i]-l)這個后綴在SA中所屬桶的當前結束位置,然后再把該桶的結束位置向左移動一 格。 下面我們以字符串“mmiiSSiiSSiippii$”為例,給出SA-IS算法中從S計算新字 符串Sl的詳細過程,以幫助理解本發(fā)明的細節(jié),首先給出各步運算結果如下
0087]00010088]01索引0 1 23 456 789 012 34 560089]02S m m ii sSi iSs iiP Pi i$0090]03t LLSS LLS SLL SSL LL LS0091]04LMS *氺氺氺0092]05第1步0093]06桶$mPS0094]07SA {16}{-1-1-1-1-1100602}{-1-1}{-1-1}{-1-1-1-1}0095]08第2步0096]09桶$mPS0097]10SA {16}{-1-1-1-1-1100602}{-1-1}{-1-1}{-1-1-1-1}0098]11r0099]12{16}{15-1-1-1-1100602}{-1-1}{-1-1}{-1-1-1-1}0100]13i0101]14{16}{1514-1-1-1100602}{-1-1}{13-1}{-1-1-10102]15i0103]16{16}{1514-1-1-1100602}{-1-1}{13-1}{09-1-10104]17i0105]18{16}{1514-1-1-1100602}{-1-1}{13-1}{0905-10106]19i0107]20{16}{1514-1-1-1100602}{01-1}{13-1}{0905-10108]21i0109]22{16}{1514-1-1-1100602}{0100}{13-1}{0905-10110]23i0111]24{16}{1514-1-1-1100602}{0100}{1312}{0905-10112]25i0113]26{16}{1514-1-1-1100602}{0100}{1312}{0905080114]27“i0115]28{16}{1514-1-1-1100602}{0100}{1312}{09050804}0116]29i0117]30第3步0118]31桶$mPS0119]32SA {16}{1514-1-1-1100602}{0100}{1312}{09050804}0120]33r0121]34{16}{1514-1-1-1100603}{0100}{1312}{09050804}
35....@ .
36{16} {15 14一l—l—l lo 07 03} {ol oo}{13 12} {09 05 08 04}
37...@..
38{16} {15 14一l—l—l l l 07 03} {ol oo}{13 12} {09 05 08 04}
39..@...
40{16} {15 14 一l —l 02 l l 07 03} {ol oo} {13 12} {09 05 08 04}
41..@...
42{16} {15 14一l 06 02 l l 07 03} {ol oo}{13 12} {09 05 08 04}
43.....
]44{16}{15 14 lo 06 02 l l 07 03}{ol oo}{13 12}{09 05 08 04}
45..@...
46 Sl2 2 l o
以上各步驟說明如下。
步驟1)標記字符串中每個字符類型。首先‘$’是S型,然后從右向左掃描一遍字符串S,按照后綴類型的定義比較當前掃描的字符SLi]和它的后繼字符SLi+1],得出字符S[i]的類型若SLi]>SLi+1],則SLi]為L型,tLi]一o;若SLi]<SLi+1],則SLi]為S型,tLi]一l;若SLi]一SLi+1],SLi]和SLi+1]的類型相同,tLi]一tLi+1]。獲取的t在第3行給出。
步驟2)求出S中各LMS子串位置。從左往右掃描字符類型數(shù)組t,標記出各個LMS子串位置,即在第4行用‘*’號標記出的位置。這些LMS子串的位置記錄在數(shù)組Pl中。
步驟3)通過LMS子串指針數(shù)組Pl1數(shù)組B和SA來把所有LMS子串進行排序,有以下的3個子步驟。
31)把字符串S中的各個LMS后綴放入SA數(shù)組中各自所屬的桶。首先初始化SA所有元素為一l,找出SA中每個后綴桶的起始和結束位置,即對應‘$’,‘i’,‘m’,‘p’,‘S’的5個字符桶。然后把四個LMS后綴放入各自對應的桶中,而且是從各自所屬桶的末端從后往前放置。第一個LMS后綴的首字符SL2]為字符‘i’,故把它放在字符‘i’桶的最后一個位置。第二個LMS字母SL6]為字母‘i’,故把它放在字符‘i’桶的倒數(shù)第二個位置。如此操作后得到第7行。
32)找出SA中每個后綴桶的起始位置,在第11行用”’標出。從左向右掃描SA數(shù)組,當前掃描到的元素用“@”在其下方標出。對于掃描到的元素SA[i],如果是一l則跳過,否則判斷字符SLSA[i黨1]的類型是否為L型。如果不是L型則跳過,否則把SA[i黨l這個數(shù)字填入SLSA[i黨1]這個字符所屬桶的當前起始位置,并把該桶的起始位置向右移動一格。例如第lo行SA[o]一16,數(shù)組t中查找SLl6一1]一i是L類型。所以把16一l—15放在‘i’字母桶的當前起始位置,然后把該桶的起始位置向右移動一格。如此完成掃描后在SA中的數(shù)據(jù)如第28行所示。
33)找出SA中每個后綴桶的結束位置,在第33行用”’標出。從右向左掃描SA數(shù)組,當前掃描到的元素用“@”在其下方標出。對于掃描到的元素SA[i],判斷字符SLSA[i黨1]的類型是否為S型。如果不是S型則跳過,否則把SA[i黨l這個數(shù)字填入S[SA[i黨1]這個字符所屬桶的當前結束位置,并把該桶的結束位置向左移動一格。因為SA最后一個元素SA[n-l] =4,則看S[4-l]的類型。由是S[4_l] = ‘ i ’是S型,所以把4_1 =3放在‘i’字符桶的當前結束位置,并把該桶的結束位置往左移動一格。如此完成掃描 后在SA中的數(shù)據(jù)如第44行所示。步驟4)重命名S中個LMS子串得到Si。從左向右掃描SA查看已排序的所有LMS 子串。從0開始編號命名各LMS字串,如果兩個相鄰的LMS子串不相等,后者編號等于前者 編號加1,否則兩個字串的編號一樣。例如第一個掃描到$,所以$編號為0,接下來掃描到 ‘i’桶里面的數(shù)值10,其對應的LMS子串為iippii$,不等于$,故編號為0+1 = 1。接下來 掃描到‘i’桶里面的數(shù)值6,其對應的LMS子串為iissi,不等于iippii$,所以標號為1+1 =2。接下來掃描到‘i’桶里面的數(shù)值2,其對應的LMS子串為iissi,等于上一個掃描到的 LMS子串,所以編號相同,都為2。最后把S中各個LMS子串用其編號代替,得到新字符串Sl =2210。以上所述僅為本發(fā)明的較佳實施方式,本發(fā)明并不局限于上述實施方式,在實施 過程中可能存在局部微小的結構改動,如果對本發(fā)明的各種改動或變型不脫離本發(fā)明的精 神和范圍,且屬于本發(fā)明的權利要求和等同技術范圍之內,則本發(fā)明也意圖包含這些改動 和變型。
權利要求
1.一種后綴數(shù)組構造方法,其特征在于,它包括步驟1)標記字符串中每個字符和后綴的類型從右向左掃描一遍字符串S,按照后綴 類型的定義比較當前掃描的兩個相鄰字符s[i]和S[i+1],得出每一個字符和后綴的類 型,用數(shù)組t來記錄;步驟2)從左向右掃描一遍數(shù)組t,找出所有LMS字符出現(xiàn)的位置,從而獲取所有LMS子 串的首字母指針,用Pl來記錄每一個LMS子串的指針;步驟3)通過LMS子串指針數(shù)組P1、數(shù)組B和SA來對S中所有的LMS子串進行排序;步驟4)根據(jù)步驟3)排序的結果重新命名字符串S中的各個LMS子串,形成一個縮短 了的新串Sl ;步驟5)如果Sl的每個字符都是唯一的,則直接排序Sl的各后綴來計算Sl的后綴數(shù) 組SA1,否則以Sl和SAl作為輸入?yún)?shù)遞歸調用SA-IS算法,即SA-IS(S1,SAl);步驟6)根據(jù)步驟5)中獲得的Sl的后綴數(shù)組SAl歸納計算S的后綴數(shù)組SA ;步驟7)返回。
2.根據(jù)權利要求1所述的后綴數(shù)組構造方法,其特征在于,所述步驟3)中對S中所有LMS 子串進行排序的過程包括31)初始化SA的所有元素為-1,找出S中所有后綴在SA中所屬各桶的結束位置,從左 向右掃描S —次,依次把掃描到的LMS后綴填入其在SA中所屬桶的當前結束位置,然后再 把該桶的結束位置向左移動一格;32)找出S中所有后綴在SA中所屬各桶的起始位置,從左向右掃描SA數(shù)組,對于掃描 到的每個不為-1的元素34[1],如果5[54[1]-1]是1^型,則把54[1]-1這個數(shù)值填入8吐(5, SA[i]-l)這個后綴在SA中所屬桶的當前起始位置,然后再把該桶的起始位置向右移動一 格;33)找出S中所有后綴在SA中所屬各桶的結束位置,從右向左掃描SA數(shù)組,對于 掃描到的每個元素SA[i],如果S[SA[i]-l]是S型,則把SA[i]-l這個數(shù)值填入suf (S, SA[i]-l)這個后綴在SA中所屬桶的當前結束位置,然后再把該桶的結束位置向左移動一 格,其中,把字符串S的所有后綴按其第一個字符在數(shù)組SA中進行排序,則所有第一個字 符相同的后綴都連續(xù)的排列在SA中的某一段區(qū)域,這段區(qū)域我們稱之為對應這些后綴的 一個桶。
3.根據(jù)權利要求2所述的后綴數(shù)組構造方法,其特征在于,所述步驟4)中計算新字符 串Sl的過程包括41)從左向右掃描SA數(shù)組中已排序的所有LMS子串,依次比較相鄰的兩個LMS子串的 大小,被比較的LMS子串從0開始編號命名,如果兩個LMS子串相等,則編號一樣,否則后者 編號等于前者的編號加1 ;42)把S中LMS子串用其在步驟41)中獲取的編號來代替,所形成的新字符串即為Si。
4.根據(jù)權利要求3所述的后綴數(shù)組構造方法,其特征在于,所述步驟6)中從SAl歸納 計算SA的步驟包括61)初始化SA的所有元素為-1,找出S中所有后綴在SA中所屬各桶的結束位置,從右向左掃描SAl數(shù)組,對每個掃描到的元素SAl [i],則把Pl [SAl [i]]放在后綴suf(S, Pl[SAl[i]])在SA中所屬桶的當前結束位置,然后再把該桶的結束位置向左移動一格;62)找出S中所有后綴在SA中所屬各桶的起始位置,從左向右掃描SA數(shù)組,對于掃描 到的每個不為-1的元素34[1],如果5[54[1]-1]是1^型,則把54[1]-1這個數(shù)值填入8吐(5, SA[i]-l)這個后綴在SA中所屬桶的當前起始位置,然后再把該桶的起始位置向右移動一 格;63)找出S中所有后綴在SA中所屬各桶的結束位置,從右向左掃描SA數(shù)組,對于 掃描到的每個元素SA[i],如果S[SA[i]-l]是S型,則把SA[i]-l這個數(shù)值填入suf (S, SA[i]-l)這個后綴在SA中所屬桶的當前結束位置,然后再把該桶的結束位置向左移動一 格。
全文摘要
本發(fā)明公開了一種線性時間后綴數(shù)組構造方法,它包括1)從右向左掃描字符串S,比較當前掃描的兩個相鄰字符S[i]和S[i+1],得出每個字符和后綴的類型,用數(shù)組t來記錄;2)從左向右掃描數(shù)組t,找出所有LMS字符出現(xiàn)的位置,獲取所有LMS子串的首字母指針,用P1來記錄LMS子串的指針;3)通過LMS子串指針數(shù)組P1、數(shù)組B和SA來對S中所有的LMS子串進行排序;4)根據(jù)3)排序的結果重新命名字符串S中的各個LMS子串,形成一個縮短了的新串S1;5)如果S1的每個字符都是唯一的,則直接排序S1的各后綴來計算S1的后綴數(shù)組SA1,否則以S1和SA1作為輸入?yún)?shù)遞歸調用SA-IS算法;6)根據(jù)5)中獲得的S1的后綴數(shù)組SA1歸納計算S的后綴數(shù)組SA;7)返回。
文檔編號G06F17/30GK102081673SQ20111002901
公開日2011年6月1日 申請日期2011年1月27日 優(yōu)先權日2011年1月27日
發(fā)明者農革 申請人:農革