后缀数组构造方法

文档序号:6353782阅读:359来源:国知局
专利名称:后缀数组构造方法
技术领域
本发明涉及一种字符串后缀数组构造方法,尤其涉及一种通过计算机在线性时间 内自动完成字符串后缀数组构造的方法。
背景技术
字符串后缀数组是后缀树的一个节省空间的替代型数据结构,最先由Manber和 Myers在文献1,2中提出,可以在更小的空间内实现等同后缀树的算法。后缀数组在数据 索引和模式匹配等应用中有广泛用途。本文发明了一个新的后缀数组构造算法,可在线性 时间内为任意给定的字符串构造其后缀数组。在本文的陈述中用到以下术语。字符集一个字符集Σ是一个建立了全序关系的集合,即Σ中任意两个不同的元素 α和β都可以比较大小,要么α < β,要么α > β。字符集Σ中的元素称为字符,其中 最小的字符为‘$’。本文所涉及的字符集大小假设为一个常数0(1)。字符串一个长度为η的字符串S是将η个属于字符集Σ中的字符按其位置依次排 列形成的数组s
,S的结束符固定为‘$’,并且‘$’不在S中的其它位置出现。子串字符串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字符。指针数组指针数组Pl记录字符串S中所有LMS子串的首字母所在的位置,即Pl [i]记录字符串S中(从左到右)第i+Ι个LMS子串的首字母在S中的位置。字符串大小比较两个字符串的大小比较,是指通常所说的“字典顺序”比较,亦即 对于两个字符串u和V,令i从0开始顺次比较u[i]和v[i]。如果u[i] = v[i]则令i加 1再继续比较下一个u[i]和v[i],否则若u[i] <v[i]则认为u<v,或者u[i] >v[i]则
认为U > Vo后缀数组S的后缀数组SA是一个包含η个整数的一维数组,对于i e
满 足SUf (S,SA [i]) <suf(S,SA[i+l])。也就是将S的η个后缀从小到大进行排序之后把排 好序的各后缀首字母在S中的位置从左到右顺次放入SA中。利用以上术语,我们给出一个构造字符串后缀数组的例子如下。字符串 S = baac$,其长度 η = 5,suf (S,0) = baac$, suf (S, 1) = aac$, suf (S, 2) = ac$, suf (S, 3) = c$, suf (S, 4) = $。根据字符串大小比较的定义容易知道suf (S, 4) < suf (S, 1) < suf (S,2) < suf (S, 0) < suf (S,3)。再根据后缀数组的定义,容易得出 SA
= 4,SA[1] = 1,SA[2] = 2,SA[3] = 0,SA[4] = 3,即 SA = [4,1,2,0,3]。现存有多种构造字符串后缀数组的计算机算法,参见文献1-8。按这些算法的时 间复杂度来分类,可以分为线性时间或超线性时间两大类。其中线性时间算法的定义为给 定一个字符集Σ上长度为η的字符串,即该字符串包含η个属于字符集Σ中的字符,对该字 符串中η个后缀进行排序的时间复杂度为Ο(η)。现存的线性时间后缀数组构造算法存在实 际运行速度慢、空间复杂度大的缺点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.

发明内容
针对以上的不足,本发明提出了一个新型的线性时间后缀数组构造方法,它包括步骤1)标记字符串中每个字符和后缀的类型从右向左扫描一遍字符串S,按照 后缀类型的定义比较当前扫描的两个相邻字符s[i]和S[i+1],得出每一个字符和后缀的 类型,用数组t来记录;步骤2)从左向右扫描一遍数组t,找出所有LMS字符出现的位置,从而获取所有 LMS子串的首字母指针,用Pl来记录每一个LMS子串的指针;步骤幻通过LMS子串指针数组P1、数组B和SA来对S中所有的LMS子串进行排 序;步骤4)根据步骤3)排序的结果重新命名字符串S中的各个LMS子串,形成一个 缩短了的新串Sl ;步骤5)如果Sl的每个字符都是唯一的,则直接排序Sl的各后缀来计算Sl的后 缀数组SAl,否则以Sl和SAl作为输入参数递归调用SA-IS算法,即SA-IS (Si,SAl);步骤6)根据步骤幻中获得的Sl的后缀数组SAl归纳计算S的后缀数组SA ;步骤7)返回。所述步骤3)中对S中所有LMS子串进行排序的过程包括31)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置, 从左向右扫描S —次,依次把扫描到的LMS后缀填入其在SA中所属桶的当前结束位置,然 后再把该桶的结束位置向左移动一格;32)找出S中所有后缀在SA中所属各桶的起始位置,从左向右扫描SA数组,对于 扫描到的每个不为"I的元素SA[i],如果S[SA[i]-l]是L型,则把SA[i]-l这个数值填入 suf (S, SA[i]-l)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右 移动一格;33)找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA数组,对 于扫描到的每个元素SA[i],如果S[SA[i]-l]是S型,则把SA[i]-l这个数值填入suf (S, SA[i]-l)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一 格,其中,把字符串S的所有后缀按其第一个字符在数组SA中进行排序,则所有第一 个字符相同的后缀都连续的排列在SA中的某一段区域,这段区域我们称之为对应这些后 缀的一个桶。所述步骤4)中计算新字符串Sl的过程包括41)从左向右扫描SA数组中已排序的所有LMS子串,依次比较相邻的两个LMS子 串的大小,被比较的LMS子串从0开始编号命名,如果两个LMS子串相等,则编号一样,否则 后者编号等于前者的编号加1 ;42)把S中LMS子串用其在步骤41)中获取的编号来代替,所形成的新字符串即为 Si。 所述步骤6)中从SAl归纳计算SA的步骤包括 61)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置, 从右向左扫描SAl数组,对每个扫描到的元素SAl [i],则把Pl [SAl [i]]放在后缀suf (S, Pl[SAl[i]])在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格;
62)找出S中所有后缀在SA中所属各桶的起始位置,从左向右扫描SA数组,对于 扫描到的每个不为"I的元素SA[i],如果S[SA[i]-l]是L型,则把SA[i]-l这个数值填入 suf (S, SA[i]-l)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右 移动一格;63)找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA数组,对 于扫描到的每个元素SA[i],如果S[SA[i]-l]是S型,则把SA[i]-l这个数值填入suf (S, SA[i]-l)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一 格。本发明的有益效果利用本发明可以在线性时间O(n)内对长度为η的字符串构造 其后缀数组,相比现存的其他线性时间后缀数组构造方法,本发明方法具有运行速度快、耗 用空间小、容易实现的优点。


图1为本发明的后缀数组构造方法的流程图。
具体实施例方式下面结合附图对本发明进行进一步阐述。如图1所示,本发明提出一个新型的线性时间后缀数组构造方法(SA-IS),可以有 效克服现存线性时间后缀数组构造算法的缺点,该流程图中各步骤的伪代码给出如下,其 中每个数组的元素以从左到右的方式存储,即第一个元素在最左边,最后一个元素在最右 边。SA-IS (S, SA)S 输入字符串;(长度为η个字符,包含nl个LMS子串)SA: S的后缀数组;Sl 整型数组;(记录对S中各LMS子串重命名后形成的新字符串,长度为nl)SAl =Sl的后缀数组t 布尔数组;(记录S中每个字符的类型,长度为η)Pl 整型数组;(记录S中各LMS子串出现的位置,长度为nl)B:整型数组;(排序时用到的辅助数组,长度为Μ Σ (S) I I (即字符集Σ中元素的 个数))步骤1)标记字符串中每个字符和后缀的类型。从右向左扫描一遍字符串S,按照 后缀类型的定义比较当前扫描的两个相邻字符s[i]和S[i+1],得出每一个字符和后缀的 类型,用数组t来记录;步骤2)从左向右扫描一遍数组t,找出所有LMS字符出现的位置,从而获取所有 LMS子串的首字母指针,用Pl来记录每一个LMS子串的指针;步骤幻通过LMS子串指针数组P1、数组B和SA来对S中所有的LMS子串进行排 序;步骤4)根据步骤3)排序的结果重新命名字符串S中的各个LMS子串,形成一个 缩短了的新串Sl ;
步骤5)如果Sl的每个字符都是唯一的,则直接排序Sl的各后缀来计算Sl的后 缀数组SAl,否则以Sl和SAl作为输入参数递归调用SA-IS算法,即SA-IS (Si,SAl);步骤6)根据步骤幻中获得的Sl的后缀数组SAl归纳计算S的后缀数组SA ;步骤7)返回。下面对步骤;3)、4)和6)的细节进行进一步描述,为方便叙述,首先介绍一个“桶” 的概念,把字符串S的所有后缀按其第一个字符在数组SA中进行排序,则所有第一个字符 相同的后缀都连续的排列在SA中的某一段区域,这段区域我们称之为对应这些后缀的一 个桶。如果S中包含有m个不同的字符,则SA中会形成m个桶,每个桶中所包含的后缀的 首字符都相同。如果一个桶所包含的后缀的首字符为‘y’,我们也简称该桶为字符 桶。 另外,当我们说把一个后缀放入SA中的一个单元,其含义是在SA中该单元记录此后缀在S 中的位置。步骤3)中对S中所有LMS子串进行排序的过程步骤描述如下31)初始化SA的所有元素为-1 ;找出S中所有后缀在SA中所属各桶的结束位置; 从左向右扫描S —次,依次把扫描到的LMS后缀填入其在SA中所属桶的当前结束位置,然 后再把该桶的结束位置向左移动一格;32)找出S中所有后缀在SA中所属各桶的起始位置;从左向右扫描SA数组,对于 扫描到的每个不为"I的元素SA[i],如果S[SA[i]-l]是L型,则把SA[i]-l这个数值填入 suf (S, SA[i]-l)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右
移动一格。33)找出S中所有后缀在SA中所属各桶的结束位置;从右向左扫描SA数组,对 于扫描到的每个元素SA[i],如果S[SA[i]-l]是S型,则把SA[i]-l这个数值填入suf (S, SA[i]-l)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一 格。步骤4)中计算新字符串Sl的步骤如下41)从左向右扫描SA数组中已排序的所有LMS子串,依次比较相邻的两个LMS子 串的大小;被比较的LMS子串从0开始编号命名,如果两个LMS子串相等,则编号一样,否则 后者编号等于前者的编号加1 ;42)把S中LMS子串用其在步骤4. 1中获取的编号来代替,所形成的新字符串即为 Si。步骤6)中从SAl归纳计算SA的流程如下61)初始化SA的所有元素为-1 ;找出S中所有后缀在SA中所属各桶的结束位置; 从右向左扫描SAl数组,对每个扫描到的元素SAl [i],则把Pl [SAl [i]]放在后缀suf (S, Pl[SAl[i]])在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格;62)找出S中所有后缀在SA中所属各桶的起始位置,从左向右扫描SA数组,对于 扫描到的每个不为"I的元素SA[i],如果S[SA[i]-l]是L型,则把SA[i]-l这个数值填入 suf (S, SA[i]-l)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右 移动一格;63)找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA数组,对 于扫描到的每个元素SA[i],如果S[SA[i]-l]是S型,则把SA[i]-l这个数值填入suf (S,SA[i]-l)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一 格。 下面我们以字符串“mmiiSSiiSSiippii$”为例,给出SA-IS算法中从S计算新字 符串Sl的详细过程,以帮助理解本发明的细节,首先给出各步运算结果如下
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子串位置。从左往右扫描字符类型数组t,标记出各个LMS子串位置,即在第4行用‘*’号标记出的位置。这些LMS子串的位置记录在数组Pl中。
步骤3)通过LMS子串指针数组Pl1数组B和SA来把所有LMS子串进行排序,有以下的3个子步骤。
31)把字符串S中的各个LMS后缀放入SA数组中各自所属的桶。首先初始化SA所有元素为一l,找出SA中每个后缀桶的起始和结束位置,即对应‘$’,‘i’,‘m’,‘p’,‘S’的5个字符桶。然后把四个LMS后缀放入各自对应的桶中,而且是从各自所属桶的末端从后往前放置。第一个LMS后缀的首字符SL2]为字符‘i’,故把它放在字符‘i’桶的最后一个位置。第二个LMS字母SL6]为字母‘i’,故把它放在字符‘i’桶的倒数第二个位置。如此操作后得到第7行。
32)找出SA中每个后缀桶的起始位置,在第11行用”’标出。从左向右扫描SA数组,当前扫描到的元素用“@”在其下方标出。对于扫描到的元素SA[i],如果是一l则跳过,否则判断字符SLSA[i党1]的类型是否为L型。如果不是L型则跳过,否则把SA[i党l这个数字填入SLSA[i党1]这个字符所属桶的当前起始位置,并把该桶的起始位置向右移动一格。例如第lo行SA[o]一16,数组t中查找SLl6一1]一i是L类型。所以把16一l—15放在‘i’字母桶的当前起始位置,然后把该桶的起始位置向右移动一格。如此完成扫描后在SA中的数据如第28行所示。
33)找出SA中每个后缀桶的结束位置,在第33行用”’标出。从右向左扫描SA数组,当前扫描到的元素用“@”在其下方标出。对于扫描到的元素SA[i],判断字符SLSA[i党1]的类型是否为S型。如果不是S型则跳过,否则把SA[i党l这个数字填入S[SA[i党1]这个字符所属桶的当前结束位置,并把该桶的结束位置向左移动一格。因为SA最后一个元素SA[n-l] =4,则看S[4-l]的类型。由是S[4_l] = ‘ i ’是S型,所以把4_1 =3放在‘i’字符桶的当前结束位置,并把该桶的结束位置往左移动一格。如此完成扫描 后在SA中的数据如第44行所示。步骤4)重命名S中个LMS子串得到Si。从左向右扫描SA查看已排序的所有LMS 子串。从0开始编号命名各LMS字串,如果两个相邻的LMS子串不相等,后者编号等于前者 编号加1,否则两个字串的编号一样。例如第一个扫描到$,所以$编号为0,接下来扫描到 ‘i’桶里面的数值10,其对应的LMS子串为iippii$,不等于$,故编号为0+1 = 1。接下来 扫描到‘i’桶里面的数值6,其对应的LMS子串为iissi,不等于iippii$,所以标号为1+1 =2。接下来扫描到‘i’桶里面的数值2,其对应的LMS子串为iissi,等于上一个扫描到的 LMS子串,所以编号相同,都为2。最后把S中各个LMS子串用其编号代替,得到新字符串Sl =2210。以上所述仅为本发明的较佳实施方式,本发明并不局限于上述实施方式,在实施 过程中可能存在局部微小的结构改动,如果对本发明的各种改动或变型不脱离本发明的精 神和范围,且属于本发明的权利要求和等同技术范围之内,则本发明也意图包含这些改动 和变型。
权利要求
1.一种后缀数组构造方法,其特征在于,它包括步骤1)标记字符串中每个字符和后缀的类型从右向左扫描一遍字符串S,按照后缀 类型的定义比较当前扫描的两个相邻字符s[i]和S[i+1],得出每一个字符和后缀的类 型,用数组t来记录;步骤2)从左向右扫描一遍数组t,找出所有LMS字符出现的位置,从而获取所有LMS子 串的首字母指针,用Pl来记录每一个LMS子串的指针;步骤3)通过LMS子串指针数组P1、数组B和SA来对S中所有的LMS子串进行排序;步骤4)根据步骤3)排序的结果重新命名字符串S中的各个LMS子串,形成一个缩短 了的新串Sl ;步骤5)如果Sl的每个字符都是唯一的,则直接排序Sl的各后缀来计算Sl的后缀数 组SA1,否则以Sl和SAl作为输入参数递归调用SA-IS算法,即SA-IS(S1,SAl);步骤6)根据步骤5)中获得的Sl的后缀数组SAl归纳计算S的后缀数组SA ;步骤7)返回。
2.根据权利要求1所述的后缀数组构造方法,其特征在于,所述步骤3)中对S中所有LMS 子串进行排序的过程包括31)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置,从左 向右扫描S —次,依次把扫描到的LMS后缀填入其在SA中所属桶的当前结束位置,然后再 把该桶的结束位置向左移动一格;32)找出S中所有后缀在SA中所属各桶的起始位置,从左向右扫描SA数组,对于扫描 到的每个不为-1的元素34[1],如果5[54[1]-1]是1^型,则把54[1]-1这个数值填入8吐(5, SA[i]-l)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右移动一 格;33)找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA数组,对于 扫描到的每个元素SA[i],如果S[SA[i]-l]是S型,则把SA[i]-l这个数值填入suf (S, SA[i]-l)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一 格,其中,把字符串S的所有后缀按其第一个字符在数组SA中进行排序,则所有第一个字 符相同的后缀都连续的排列在SA中的某一段区域,这段区域我们称之为对应这些后缀的 一个桶。
3.根据权利要求2所述的后缀数组构造方法,其特征在于,所述步骤4)中计算新字符 串Sl的过程包括41)从左向右扫描SA数组中已排序的所有LMS子串,依次比较相邻的两个LMS子串的 大小,被比较的LMS子串从0开始编号命名,如果两个LMS子串相等,则编号一样,否则后者 编号等于前者的编号加1 ;42)把S中LMS子串用其在步骤41)中获取的编号来代替,所形成的新字符串即为Si。
4.根据权利要求3所述的后缀数组构造方法,其特征在于,所述步骤6)中从SAl归纳 计算SA的步骤包括61)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SAl数组,对每个扫描到的元素SAl [i],则把Pl [SAl [i]]放在后缀suf(S, Pl[SAl[i]])在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格;62)找出S中所有后缀在SA中所属各桶的起始位置,从左向右扫描SA数组,对于扫描 到的每个不为-1的元素34[1],如果5[54[1]-1]是1^型,则把54[1]-1这个数值填入8吐(5, SA[i]-l)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右移动一 格;63)找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA数组,对于 扫描到的每个元素SA[i],如果S[SA[i]-l]是S型,则把SA[i]-l这个数值填入suf (S, SA[i]-l)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一 格。
全文摘要
本发明公开了一种线性时间后缀数组构造方法,它包括1)从右向左扫描字符串S,比较当前扫描的两个相邻字符S[i]和S[i+1],得出每个字符和后缀的类型,用数组t来记录;2)从左向右扫描数组t,找出所有LMS字符出现的位置,获取所有LMS子串的首字母指针,用P1来记录LMS子串的指针;3)通过LMS子串指针数组P1、数组B和SA来对S中所有的LMS子串进行排序;4)根据3)排序的结果重新命名字符串S中的各个LMS子串,形成一个缩短了的新串S1;5)如果S1的每个字符都是唯一的,则直接排序S1的各后缀来计算S1的后缀数组SA1,否则以S1和SA1作为输入参数递归调用SA-IS算法;6)根据5)中获得的S1的后缀数组SA1归纳计算S的后缀数组SA;7)返回。
文档编号G06F17/30GK102081673SQ20111002901
公开日2011年6月1日 申请日期2011年1月27日 优先权日2011年1月27日
发明者农革 申请人:农革
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1