基于基数排序的字符串后缀数组构造方法

文档序号:6353781阅读:299来源:国知局
专利名称:基于基数排序的字符串后缀数组构造方法
技术领域
本发明涉及一种字符串后缀数组构造方法,尤其涉及一种通过计算机在线性时间 内利用基数排序自动完成字符串后缀数组构造的方法。
背景技术
字符串后缀数组是后缀树的一个节省空间的替代型数据结构,最先由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中。d-字符字符串S中的字符S[i]是d-字符,d彡2,当且仅当满足以下条件l)S[i]是一个LMS字符;或者2)S[i_d]是d-字符,S[i+1]不是LMS字符,并且子串S[i-d+l..i_l]内没有d_字符。d-子串对S中的每个d-字符S[i],d彡2和i <n-d_l,子串S[i. . i+d+1]称为 一个 d-子串。如果 i 彡 η-d-l,则 S[i. . i+d+1] = 5[土..11-2]{5[11-1]}(1+1-(11-24),其中 {S [η-1]} χ表示把字符S [η-1]重复χ次所构成的字符串。指针数组指针数组Pl记录字符串S中所有d-子串的首字母所在的位置,即Pl [i] 记录字符串S中(从左到右)第i+Ι个d-子串的首字母在S中的位置。加权字符字符串S中的字符S[i]的加权字符定义为Sw[i] = 2S[i]+t[i]。d-加权子串字符串S中的d-子串S[i.. j]的加权子串定义为Sv[i.. j] = S[i.. j-l]Sw[j]0利用以上术语,我们给出一个构造字符串后缀数组的例子如下。字符串 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,,,in Proceedings of SODA, 1990, pp. 319-327.2、U. Manber and G. Myers, "Suffix arrays :A new method for on-line string searches,,,SIAM Journal 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, "in Proceedings of CPM,2003, pp.186-199.4、P. Ko and S. Aluru,"Space-efficient linear time construction of suffix arrays, "Journal of Discrete 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 arrayconstruction 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-3670

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


图1为本发明基于基数排序的字符串后缀数组构造方法的流程图。
具体实施例方式下面结合附图对本发明进行进一步阐述。如图1所示,本发明的基于基数排序的字符串后缀数组构造方法的流程图中各步 骤的伪代码给出如下,其中每个数组的元素以从左到右的方式存储,即第一个元素在最左 边,最后一个元素在最右边。根据d-子串的定义,我们知道每个d-子串的长度都是固定为d+2个字符,其中 d ^ 2,因此,对S中所有定长d-子串进行排序时可以利用简单快速的基数排序算法。相比 其他线性时间后缀数组构造算法,这个特点是本发明方法的一个独特优点。SA-IS (S, SA)S 输入字符串;(长度为η个字符,包含nl个d-子串)SA =S的后缀数组;Sl 整型数组;(记录对S中各d-子串重命名后形成的新字符串,长度为nl)SAl =Sl的后缀数组t 布尔数组;(记录S中每个字符的类型,长度为η)Pl 整型数组;(记录S中各d-子串出现的位置,长度为nl)B:整型数组;(排序时用到的辅助数组,长度为Μ Σ (S) I I (即字符集Σ中元素的 个数))
1)标记字符串中每个字符和后缀的类型。从右向左扫描一遍字符串S,按照后缀 类型的定义比较当前扫描的两个相邻字符s[i]和S[i+1],得出每一个字符和后缀的类型, 用数组t来记录;2)从左向右扫描一遍数组t,找出所有d-字符出现的位置,从而获取所有d-子串 的首字母指针,用Pl来记录每一个d-子串的指针;3)通过d-子串指针数组P1、数组B和SA来对S中所有的d_加权子串进行基数 排序;4)根据步骤幻排序的结果重新命名字符串S中的各个d-加权子串,形成一个缩 短了的新串Si;5)如果Sl的每个字符都是唯一的,则直接排序Sl的各后缀来计算Sl的后缀数组 SAl,否则以Sl和SAl作为输入参数递归调用SA-IS算法,即SA-DS (Si,SAl);6)根据步骤5)中获得的Sl的后缀数组SAl归纳计算S的后缀数组SA ;7)返回。下面对上述步骤!3)、4)h和6)的细节进行进一步描述,为方便叙述,首先引入一个 概念“桶”,把字符串S的所有后缀按其第一个字符在数组SA中进行排序,则所有第一个字 符相同的后缀都连续排列在SA中的某一段区域,这段区域我们称之为对应这些后缀的一 个桶。如果S中包含有m个不同的字符,则SA中会形成m个桶,每个桶中所包含的后缀的 首字符都相同。如果一个桶所包含的后缀的首字符为‘y’,我们也简称该桶为字符 桶。 另外,当我们说把一个后缀放入SA中的一个单元,其含义是在SA中该单元记录此后缀在S 中的位置。步骤幻中对S中所有d-加权子串进行基数排序的步骤如下31)对所有d-加权子串的最后一个字符进行两轮基数排序(1)先根据每个字符 的类型进行基数排序;(2)然后再根据每个字符的大小进行基数排序;32)在步骤31的排序结果上,继续对所有d-加权子串根据它们的前d+Ι个字符进 行基数排序从每个d-加权子串的倒数第二个字符开始到第一个字符结束,每轮根据一个 字符排序,总共排d+Ι轮。步骤4)中计算新字符串Sl的步骤如下41)从左向右扫描SA数组中已排序的所有d-加权子串,依次比较相邻的两个 d-加权子串的大小,被比较的d-加权子串从0开始编号命名,如果两个d-加权子串相等, 则编号一样,否则后者编号等于前者的编号加1。42)把S中各个d-加权子串用其在步骤41)中获取的编号来代替,所形成的新字 符串即为Si。步骤6)中从SAl归纳计算SA的流程如下61)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置, 从右向左扫描SAl数组,对每个扫描到的元素SAl [i],如果suf (S,Pl [SAl [i]])是LMS后 缀,则把Pl [SAl [i]]放在后缀suf (S,Pl [SAl [i]])在SA中所属桶的当前结束位置,然后再 把该桶的结束位置向左移动一格。62)找出S中所有后缀在SA中所属各桶的起始位置,从左向右扫描SA数组,对于 扫描到的每个不为—I的元素SA[i],如果S[SA[i]-l]是L型,则把SA[i]-l这个数值填入
8Suf(S,SA[i党1)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右移动一格。
63)找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA数组,对于扫描到的每个元素SA[i],如果SLSA[i党1]是S型,则把SA[i党l这个数值填入Suf(S,SA[i党1)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格。
下面我们以字符串“mmiiSSiiSSiippii$”和d一2为例,给出SA—DS算法从S计算其后缀数组SA的详细过程,以帮助理解本发明的细节。首先给出各步运算结果如下
递归层次o
注释扫描S计算数组t和Pl
l
ol索弓!o l 2 3 4 5 6 7 8 9 o l 2 3 4 5 6
02 Sm m i i S S i i S S i i p p i i$
03 to o l l o o l l o o l l o o o o l
04 Pl2 4 6 8 l o 12 14 16
注释对Pl中的d一加权子串进行基数排序和命名以产生Sl
05第l轮14 16 12 4 8 lo 2 6
06第2轮14 16 12 4 8 lo 2 6
07第3轮16 14 lo 2 6 12 4 8
08第4轮16 14 lo 2 6 12 4 8
05] 09 Sl3 5 3 5 2 4 l o
递归层次l
注释扫描S计算数组t和Pl
lo索弓!o l 2 3 4 5 6 7
09] l l S3 5 3 5 2 4 l o
]0]12tl o l o l o o l
]]]13Pl2 4 7
注释对Pl中的d一加权子串进行基数排序和命名以产生Sl
14第l轮4 7 2
15第2轮7 4 2
16第3轮7 4 2
17第4轮7 4 2
18Sl 2 l o
19SAl2 l o
递归结束,开始回溯
递归层次l
注释从SAl归纳排序出SA
20索弓!o l 2 3 4 5 6 7
2l SAl2 l o
22 第 1 步7 -1 4 -1 2 -1-1-1
23 第 2 步7 6 4 -1 2 531
对第3步7 64 20 531
递归层次0
注释从SAl归纳排序出SA
1
25 索引0123456 7 89 0 12 34 5 6
26 SAl 7 6 4 2 053 1
27 第 1 步16 -1 -1 -1 -1-110 6 2-1 -1 -1-1 -1-1 -1 -1
沘第 2 步16 15 14 -1 -1-110 6 21 0 1312 95 8 4
四第 3 步16 15 14 10 621 1 73 10 1312 95 8 4
以上各步骤说明如下。
1)标记字符串中每个字符类型。首先‘$’是S型,然后从右向左扫描一遍字符串S,按照后缀类型的定义比较当前扫描的字符S[i]和它的后继字符S[i+1],得出字符S[i]
的类型,若 S[i] >S[i+l],则 S[i]为 L 型,t[i] =0;若 S[i] <S[i+l],则 S[i]为 S 型, t[i] = 1 ;若 S[i] = S[i+1],S[i]和 S[i+1]的类型相同,即 t[i] = t[i+l],获取的 t 在 第3行给出。2)求出S中各d-子串位置。从左往右扫描字符类型数组t,标记出各个d-子串 位置,并按它们在S中的位置从左到右依次记录在第4行的数组Pl中。对应的d-子串为 Uiss (2),ssii (4),iiss (6),ssii (8),iipp (10),ppii (12),ii$ (14),$ (16)},其中每个子 串后面小括号里的数字是该子串在S中的位置,由于此例子假设d = 2,故每个d-子串的长 度固定为d+2 = 4个字符。3)通过d-子串指针数组P1、数组B和SA来把所有d-加权子串进行基数排序。第 1轮根据各d-加权子串的最后一个字符排序,结果在第5行给出。之后3轮继续根据d-加 权子串的前3个字符排序,依次得到的排序结果在第6-8行给出。根据第8行的结果,所 有 d-加权子串从小到大排序为{$ (16),ii$ (14),iipp (10),iiss ⑵,iiss (6),ppii (12), ssii(4),ssii (8)}。4)对已排序的d-加权子串进行编号命名,可得结果为{0,1,2,3,3,4,5,5}。再把 S中各d-子串用他们的编号代替,得到在第9行给出的新字符串Sl= [3,5,3,5,2,4,1,0]。5)由于Sl中有相同的字符,故以Sl和SAl为参数递归调用SA-DS (Si,SAl),进入 递归层次1。在第18行,由于Sl中的字符各不相同,故直接排序Sl的各后缀,在第19行得 到Sl的后缀数组SAl。6)第20-M行是在递归层次1上从SAl归纳排序出SA。此层次上的S为递归层 次0上的Si,即第9行给出的Sl ;而此层次上的Pl在第13行给出,SAl在19行给出。换 言之,在此递归层次有 S= [3,5,3,5,2,4,1,0], Pl = [2,4,7], SAl = [2,1,0]。1)在第21行先初始化SA的所有元素为-1。然后找出各后缀桶的结束位置,再从 右向左扫描SA1。因为SA1[2] =0,则查看P1
的值为2,由于S [2]是LMS字符,则把位 置2放入后缀suf (S,2)在SA中所属桶的当前结束位置,此处为SA[4],并把该桶的结束位 置向左移一格。完成扫描SAl后,S的所有LMS子串都放在其所属桶的末端,如第22行所示。2)在第23行先找出S中所有后缀在SA中所属各桶的起始位置,然后从左向右扫 描SA数组。因为SA
= 7,并且S [7-1]是L型,则把7_1 = 6这个数值填入后缀suf (S, 6)在SA中所属桶的当前起始位置,此处为SA[1],然后再把这个桶的起始位置向右移动一 格。扫描到SA[1] =6时,因为S[6-1]是L型,则把6-1 = 5这个数值填入后缀suf (S,5) 在SA中所属桶的当前起始位置,此处为SA[5],然后再把这个桶的起始位置向右移动一格。 扫描到SA[3] =-1时,跳过。继续扫描到SA[5] =5时,因为S[5-l]不是L型,也跳过。如 此完成扫描SAl后,S的所有L类型的后缀都放在SA内其所属桶的前端,第23行所示。3)在第对行先找出S中所有后缀在SA中所属各桶的结束位置,然后从右向左扫 描SA数组。因为SA[7] = 1,并且S[l-1]是S型,则把1-1 = 0这个数值填入后缀suf (S, 0)在SA中所属桶的当前结束位置,此处为SAW],然后再把这个桶的结束位置向左移动一 格。扫描到SAW] =3时,因为S [3-1]是S型,则把3-1 = 2这个数值填入后缀suf (S,2) 在SA中所属桶的当前结束位置,此处为SA[3],然后再把这个桶的结束位置向左移动一格。 继续扫描到SA[2] =4时,因为S[4-l]不是S型,则跳过。如此完成扫描SAl后,S的所有 后缀都放在各自所属桶,如第对行所示。第25- 行是在递归层次0上从SAl归纳排序出SA,其运算过程与第20- 行类 似。第四行是最后输出的后缀数组。以上所述仅为本发明的较佳实施方式,本发明并不局限于上述实施方式,在实施 过程中可能存在局部微小的结构改动,如果对本发明的各种改动或变型不脱离本发明的精 神和范围,且属于本发明的权利要求和等同技术范围之内,则本发明也意图包含这些改动 和变型。
权利要求
1.一种基于基数排序的字符串后缀数组构造方法,其特征在于,它包括1)标记字符串中每个字符和后缀的类型,从右向左扫描一遍字符串S,按照后缀类型的 定义比较当前扫描的两个相邻字符s[i]和S[i+1],得出每一个字符和后缀的类型,用数 组t来记录;2)从左向右扫描一遍数组t,找出所有d-字符出现的位置,从而获取所有d-子串的首 字母指针,用Pl来记录每一个d-子串的指针;3)通过d-子串指针数组Pl、数组B和SA来对S中所有的d-加权子串进行基数排序;4)根据3)排序的结果重新命名字符串S中的各个d-加权子串,形成一个缩短了的新 串Sl ;5)如果Sl的每个字符都是唯一的,则直接排序Sl的各后缀来计算Sl的后缀数组SA1, 否则以Sl和SAl作为输入参数递归调用SA-IS算法,即SA-DS (Si,SAl);6)根据5)中获得的Sl的后缀数组SAl归纳计算S的后缀数组SA;7)返回。
2.根据权利要求1所述的基于基数排序的字符串后缀数组构造方法,其特征在于,所 述步骤3)中对S中所有d-加权子串进行基数排序的过程包括31)对所有d-加权子串的最后一个字符进行两轮基数排序先根据每个字符的类型进 行基数排序,然后再根据每个字符的大小进行基数排序;32)在步骤31)的排序结果上,继续对所有d-加权子串根据它们的前d+Ι个字符进行 基数排序从每个d-加权子串的倒数第二个字符开始到第一个字符结束,每轮根据一个字 符排序,总共排d+Ι轮。
3.根据权利要求2所述的基于基数排序的字符串后缀数组构造方法,其特征在于,所 述步骤4)中计算新字符串Sl的步骤包括41)从左向右扫描SA数组中已排序的所有d-加权子串,依次比较相邻的两个d-加权 子串的大小,被比较的d-加权子串从0开始编号命名,如果两个d-加权子串相等,则编号 一样,否则后者编号等于前者的编号加1 ;42)把S中各个d-加权子串用其在步骤41)中获取的编号来代替,所形成的新字符串 即为Si。
4.根据权利要求3所述的基于基数排序的字符串后缀数组构造方法,其特征在于,所 述步骤6)中从SAl归纳计算SA的过程如下61)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置,从右 向左扫描SAl数组,对每个扫描到的元素SAl [i],如果suf(S,Pl [SAl [i]])是LMS后缀, 则把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中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一 格,其中,把字符串S的所有后缀按其第一个字符在数组SA中进行排序,则所有第一个字 符相同的后缀都连续排列在SA中的某一段区域,这段区域我们称之为对应这些后缀的一 个桶。
全文摘要
本发明公开了一种基于基数排序的字符串后缀数组构造方法,它包括1)从右向左扫描字符串S,比较当前扫描的两个相邻字符S[i]和S[i+1],得出每个字符和后缀的类型,用数组t记录;2)从左向右扫描数组t,找出所有d-字符出现的位置,获取所有d-子串的首字母指针,用P1来记录每个d-子串的指针;3)通过d-子串指针数组P1、数组B和SA来对S中所有的d-加权子串进行基数排序;4)根据3)排序的结果重新命名字符串S中的各个d-加权子串,形成缩短的新串S1;5)如果S1的每个字符都是唯一的,则直接排序S1的各后缀来计算S1的后缀数组SA1,否则以S1和SA1作为输入参数递归调用SA-IS算法;6)根据5)中获得的S1的后缀数组SA1归纳计算S的后缀数组SA;7)返回。
文档编号G06F17/30GK102073740SQ20111002901
公开日2011年5月25日 申请日期2011年1月27日 优先权日2011年1月27日
发明者农革 申请人:农革
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1