CN102081673A - 后缀数组构造方法 - Google Patents
后缀数组构造方法 Download PDFInfo
- Publication number
- CN102081673A CN102081673A CN2011100290142A CN201110029014A CN102081673A CN 102081673 A CN102081673 A CN 102081673A CN 2011100290142 A CN2011100290142 A CN 2011100290142A CN 201110029014 A CN201110029014 A CN 201110029014A CN 102081673 A CN102081673 A CN 102081673A
- Authority
- CN
- China
- Prior art keywords
- suffix
- array
- lms
- character
- barrel
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Machine Translation (AREA)
Abstract
本发明公开了一种线性时间后缀数组构造方法,它包括: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)返回。
Description
技术领域
本发明涉及一种字符串后缀数组构造方法,尤其涉及一种通过计算机在线性时间内自动完成字符串后缀数组构造的方法。
背景技术
字符串后缀数组是后缀树的一个节省空间的替代型数据结构,最先由Manber和Myers在文献【1,2】中提出,可以在更小的空间内实现等同后缀树的算法。后缀数组在数据索引和模式匹配等应用中有广泛用途。本文发明了一个新的后缀数组构造算法,可在线性时间内为任意给定的字符串构造其后缀数组。
在本文的陈述中用到以下术语。
字符集一个字符集∑是一个建立了全序关系的集合,即∑中任意两个不同的元素α和β都可以比较大小,要么α<β,要么α>β。字符集∑中的元素称为字符,其中最小的字符为‘$’。本文所涉及的字符集大小假设为一个常数O(1)。
字符串一个长度为n的字符串S是将n个属于字符集∑中的字符按其位置依次排列形成的数组S[0..n-1],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-1]。
字符和后缀类型S中的字符分为L和S两种类型:
1)‘$’为S类型;
2)S[i],i∈[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∈[1,n-1]为L类型,当且仅当suf(S,i)>suf(S,i+1),即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类型。
LMS(leftmost S-type,最左S类型)字符和后缀
1)‘$’为LMS字符;
2)S[i],i∈[1,n-1]为LMS字符,当且仅当S[i]为S类型且S[i-1]为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字符。
指针数组指针数组P1记录字符串S中所有LMS子串的首字母所在的位置,即P1[i]记录字符串S中(从左到右)第i+1个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>v。
后缀数组S的后缀数组SA是一个包含n个整数的一维数组,对于i∈[0,n-1]满足suf(S,SA[i])<suf(S,SA[i+1])。也就是将S的n个后缀从小到大进行排序之后把排好序的各后缀首字母在S中的位置从左到右顺次放入SA中。
利用以上术语,我们给出一个构造字符串后缀数组的例子如下。
字符串S=baac$,其长度n=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[0]=4,SA[1]=1,SA[2]=2,SA[3]=0,SA[4]=3,即SA=[4,1,2,0,3]。
现存有多种构造字符串后缀数组的计算机算法,参见文献【1-8】。按这些算法的时间复杂度来分类,可以分为线性时间或超线性时间两大类。其中线性时间算法的定义为:给定一个字符集∑上长度为n的字符串,即该字符串包含n个属于字符集∑中的字符,对该字符串中n个后缀进行排序的时间复杂度为O(n)。现存的线性时间后缀数组构造算法存在实际运行速度慢、空间复杂度大的缺点【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子串的首字母指针,用P1来记录每一个LMS子串的指针;
步骤3)通过LMS子串指针数组P1、数组B和SA来对S中所有的LMS子串进行排序;
步骤4)根据步骤3)排序的结果重新命名字符串S中的各个LMS子串,形成一个缩短了的新串S1;
步骤5)如果S1的每个字符都是唯一的,则直接排序S1的各后缀来计算S1的后缀数组SA1,否则以S1和SA1作为输入参数递归调用SA-IS算法,即SA-IS(S1,SA1);
步骤6)根据步骤5)中获得的S1的后缀数组SA1归纳计算S的后缀数组SA;
步骤7)返回。
所述步骤3)中对S中所有LMS子串进行排序的过程包括:
31)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置,从左向右扫描S一次,依次把扫描到的LMS后缀填入其在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格;
32)找出S中所有后缀在SA中所属各桶的起始位置,从左向右扫描SA数组,对于扫描到的每个不为-1的元素SA[i],如果S[SA[i]-1]是L型,则把SA[i]-1这个数值填入suf(S,SA[i]-1)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右移动一格;
33)找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA数组,对于扫描到的每个元素SA[i],如果S[SA[i]-1]是S型,则把SA[i]-1这个数值填入suf(S,SA[i]-1)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格,
其中,把字符串S的所有后缀按其第一个字符在数组SA中进行排序,则所有第一个字符相同的后缀都连续的排列在SA中的某一段区域,这段区域我们称之为对应这些后缀的一个桶。
所述步骤4)中计算新字符串S1的过程包括:
41)从左向右扫描SA数组中已排序的所有LMS子串,依次比较相邻的两个LMS子串的大小,被比较的LMS子串从0开始编号命名,如果两个LMS子串相等,则编号一样,否则后者编号等于前者的编号加1;
42)把S中LMS子串用其在步骤41)中获取的编号来代替,所形成的新字符串即为S1。
所述步骤6)中从SA1归纳计算SA的步骤包括:
61)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA1数组,对每个扫描到的元素SA1[i],则把P1[SA1[i]]放在后缀suf(S,P1[SA1[i]])在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格;
62)找出S中所有后缀在SA中所属各桶的起始位置,从左向右扫描SA数组,对于扫描到的每个不为-1的元素SA[i],如果S[SA[i]-1]是L型,则把SA[i]-1这个数值填入suf(S,SA[i]-1)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右移动一格;
63)找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA数组,对于扫描到的每个元素SA[i],如果S[SA[i]-1]是S型,则把SA[i]-1这个数值填入suf(S,SA[i]-1)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格。
本发明的有益效果:利用本发明可以在线性时间O(n)内对长度为n的字符串构造其后缀数组,相比现存的其他线性时间后缀数组构造方法,本发明方法具有运行速度快、耗用空间小、容易实现的优点。
附图说明
图1为本发明的后缀数组构造方法的流程图。
具体实施方式
下面结合附图对本发明进行进一步阐述。
如图1所示,本发明提出一个新型的线性时间后缀数组构造方法(SA-IS),可以有效克服现存线性时间后缀数组构造算法的缺点,该流程图中各步骤的伪代码给出如下,其中每个数组的元素以从左到右的方式存储,即第一个元素在最左边,最后一个元素在最右边。
SA-IS(S,SA)
S:输入字符串;(长度为n个字符,包含n1个LMS子串)
SA:S的后缀数组;
S1:整型数组;(记录对S中各LMS子串重命名后形成的新字符串,长度为n1)
SA1:S1的后缀数组
t:布尔数组;(记录S中每个字符的类型,长度为n)
P1:整型数组;(记录S中各LMS子串出现的位置,长度为n1)
B:整型数组;(排序时用到的辅助数组,长度为||∑(S)||(即字符集∑中元素的个数))
步骤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算法,即SA-IS(S1,SA1);
步骤6)根据步骤5)中获得的S1的后缀数组SA1归纳计算S的后缀数组SA;
步骤7)返回。
下面对步骤3)、4)和6)的细节进行进一步描述,为方便叙述,首先介绍一个“桶”的概念,把字符串S的所有后缀按其第一个字符在数组SA中进行排序,则所有第一个字符相同的后缀都连续的排列在SA中的某一段区域,这段区域我们称之为对应这些后缀的一个桶。如果S中包含有m个不同的字符,则SA中会形成m个桶,每个桶中所包含的后缀的首字符都相同。如果一个桶所包含的后缀的首字符为‘y’,我们也简称该桶为字符‘y’桶。另外,当我们说把一个后缀放入SA中的一个单元,其含义是在SA中该单元记录此后缀在S中的位置。
步骤3)中对S中所有LMS子串进行排序的过程步骤描述如下:
31)初始化SA的所有元素为-1;找出S中所有后缀在SA中所属各桶的结束位置;从左向右扫描S一次,依次把扫描到的LMS后缀填入其在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格;
32)找出S中所有后缀在SA中所属各桶的起始位置;从左向右扫描SA数组,对于扫描到的每个不为-1的元素SA[i],如果S[SA[i]-1]是L型,则把SA[i]-1这个数值填入suf(S,SA[i]-1)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右移动一格。
33)找出S中所有后缀在SA中所属各桶的结束位置;从右向左扫描SA数组,对于扫描到的每个元素SA[i],如果S[SA[i]-1]是S型,则把SA[i]-1这个数值填入suf(S,SA[i]-1)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格。
步骤4)中计算新字符串S1的步骤如下:
41)从左向右扫描SA数组中已排序的所有LMS子串,依次比较相邻的两个LMS子串的大小;被比较的LMS子串从0开始编号命名,如果两个LMS子串相等,则编号一样,否则后者编号等于前者的编号加1;
42)把S中LMS子串用其在步骤4.1中获取的编号来代替,所形成的新字符串即为S1。
步骤6)中从SA1归纳计算SA的流程如下:
61)初始化SA的所有元素为-1;找出S中所有后缀在SA中所属各桶的结束位置;从右向左扫描SA1数组,对每个扫描到的元素SA1[i],则把P1[SA1[i]]放在后缀suf(S,P1[SA1[i]])在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格;
62)找出S中所有后缀在SA中所属各桶的起始位置,从左向右扫描SA数组,对于扫描到的每个不为-1的元素SA[i],如果S[SA[i]-1]是L型,则把SA[i]-1这个数值填入suf(S,SA[i]-1)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右移动一格;
63)找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA数组,对于扫描到的每个元素SA[i],如果S[SA[i]-1]是S型,则把SA[i]-1这个数值填入suf(S,SA[i]-1)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格。
下面我们以字符串“mmiissiissiippii$”为例,给出SA-IS算法中从S计算新字符串S1的详细过程,以帮助理解本发明的细节,首先给出各步运算结果如下:
00 0 1
01 索引:0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
02 S:m m i i s s i i s s i i p p i i $
03 t:L L S S L L S S L L S S L L L L S
04 LMS: * * * *
05 第1步:
06 桶: $ i m p s
07 SA:{16} {-1 -1 -1 -1 -1 10 06 02} {-1 -1} {-1 -1} {-1 -1 -1 -1}
08 第2步:
09 桶: $ i m p s
10 SA:{16} {-1 -1 -1 -1 -1 10 06 02} {-1 -1} {-1 -1} {-1 -1 -1 -1}
11 @ ^^^^^
12 {16} {15 -1 -1 -1 -1 10 06 02} {-1 -1} {-1 -1} {-1 -1 -1 -1}
13 ^@ ^^^^
14 {16} {15 14 -1 -1 -1 10 06 02} {-1 -1} {13 -1} {-1 -1 -1 -1}
15 ^@ ^^^^
16 {16} {15 14 -1 -1 -1 10 06 02} {-1 -1} {13 -1} {09 -1 -1 -1}
17 ^^@ ^^^
18 {16} {15 14 -1 -1 -1 10 06 02} {-1 -1} {13 -1} {09 05 -1 -1}
19 ^^@ ^^^
20 {16} {15 14 -1 -1 -1 10 06 02} {01 -1} {13 -1} {09 05 -1 -1}
21 ^^@ ^^^
22 {16} {15 14 -1 -1 -1 10 06 02} {01 00} {13 -1} {09 05 -1 -1}
23 ^^@ ^^^
24 {16} {15 14 -1 -1 -1 10 06 02} {01 00} {13 12} {09 05 -1 -1}
25 ^^^@ ^^
26 {16} {15 14 -1 -1 -1 10 06 02} {01 00} {13 12} {09 05 08 -1}
27 ^^^^@ ^
28 {16} {15 14 -1 -1 -1 10 06 02} {01 00} {13 12} {09 05 08 04}
29 ^^^^@ ^
30 第3步:
31 桶: $ i m p s
32 SA:{16} {15 14 -1 -1 -1 10 06 02} {01 00} {13 12} {09 05 08 04}
33 ^^^^@^
34 {16} {15 14 -1 -1 -1 10 06 03} {01 00} {13 12} {09 05 08 04}
35 ^^^^@ ^
36 {16} {15 14 -1 -1 -1 10 07 03} {01 00} {13 12} {09 05 08 04}
37 ^^^@ ^^
38 {16} {15 14 -1 -1 -1 11 07 03} {01 00} {13 12} {09 05 08 04}
39 ^^@ ^^^
40 {16} {15 14 -1 -1 02 11 07 03} {01 00} {13 12} {09 05 08 04}
41 ^^@ ^^^
42 {16} {15 14 -1 06 02 11 07 03} {01 00} {13 12} {09 05 08 04}
43 ^^^^^
44 {16} {15 14 10 06 02 11 07 03} {01 00} {13 12} {09 05 08 04}
45 ^^@ ^^^
46 S1: 2 2 1 0
以上各步骤说明如下。
步骤1)标记字符串中每个字符类型。首先‘$’是S型,然后从右向左扫描一遍字符串S,按照后缀类型的定义比较当前扫描的字符S[i]和它的后继字符S[i+1],得出字符S[i]的类型:若S[i]>S[i+1],则S[i]为L型,t[i]=0;若S[i]<S[i+1],则S[i]为S型,t[i]=1;若S[i]=S[i+1],S[i]和S[i+1]的类型相同,t[i]=t[i+1]。获取的t在第3行给出。
步骤2)求出S中各LMS子串位置。从左往右扫描字符类型数组t,标记出各个LMS子串位置,即在第4行用‘*’号标记出的位置。这些LMS子串的位置记录在数组P1中。
步骤3)通过LMS子串指针数组P1、数组B和SA来把所有LMS子串进行排序,有以下的3个子步骤。
31)把字符串S中的各个LMS后缀放入SA数组中各自所属的桶。首先初始化SA所有元素为-1,找出SA中每个后缀桶的起始和结束位置,即对应‘$’,‘i’,‘m’,‘p’,‘s’的5个字符桶。然后把四个LMS后缀放入各自对应的桶中,而且是从各自所属桶的末端从后往前放置。第一个LMS后缀的首字符S[2]为字符‘i’,故把它放在字符‘i’桶的最后一个位置。第二个LMS字母S[6]为字母‘i’,故把它放在字符‘i’桶的倒数第二个位置。如此操作后得到第7行。
32)找出SA中每个后缀桶的起始位置,在第11行用‘^’标出。从左向右扫描SA数组,当前扫描到的元素用“@”在其下方标出。对于扫描到的元素SA[i],如果是-1则跳过,否则判断字符S[SA[i]-1]的类型是否为L型。如果不是L型则跳过,否则把SA[i]-1这个数字填入S[SA[i]-1]这个字符所属桶的当前起始位置,并把该桶的起始位置向右移动一格。例如第10行SA[0]=16,数组t中查找S[16-1]=i是L类型。所以把16-1=15放在‘i’字母桶的当前起始位置,然后把该桶的起始位置向右移动一格。如此完成扫描后在SA中的数据如第28行所示。
33)找出SA中每个后缀桶的结束位置,在第33行用‘^’标出。从右向左扫描SA数组,当前扫描到的元素用“@”在其下方标出。对于扫描到的元素SA[i],判断字符S[SA[i]-1]的类型是否为S型。如果不是S型则跳过,否则把SA[i]-1这个数字填入S[SA[i]-1]这个字符所属桶的当前结束位置,并把该桶的结束位置向左移动一格。因为SA最后一个元素SA[n-1]=4,则看S[4-1]的类型。由是S[4-1]=‘i’是S型,所以把4-1=3放在‘i’字符桶的当前结束位置,并把该桶的结束位置往左移动一格。如此完成扫描后在SA中的数据如第44行所示。
步骤4)重命名S中个LMS子串得到S1。从左向右扫描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子串用其编号代替,得到新字符串S1=2210。
以上所述仅为本发明的较佳实施方式,本发明并不局限于上述实施方式,在实施过程中可能存在局部微小的结构改动,如果对本发明的各种改动或变型不脱离本发明的精神和范围,且属于本发明的权利要求和等同技术范围之内,则本发明也意图包含这些改动和变型。
Claims (4)
1.一种后缀数组构造方法,其特征在于,它包括:
步骤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算法,即SA-IS(S1, SA1);
步骤6)根据步骤5)中获得的S1的后缀数组 SA1归纳计算S的后缀数组SA;
步骤7)返回。
2.根据权利要求1所述的后缀数组构造方法,其特征在于,所述步骤 3)中对S中所有LMS子串进行排序的过程包括:
31)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置,从左向右扫描S一次,依次把扫描到的LMS后缀填入其在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格;
32)找出S中所有后缀在SA中所属各桶的起始位置,从左向右扫描SA数组,对于扫描到的每个不为-1的元素SA[i],如果S[SA[i]-1]是L型,则把SA[i]-1这个数值填入suf(S, SA[i]-1)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右移动一格;
33)找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA数组, 对于扫描到的每个元素SA[i],如果S[SA[i]-1]是S型,则把SA[i]-1这个数值填入suf(S, SA[i]-1)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格,
其中,把字符串S的所有后缀按其第一个字符在数组SA中进行排序,则所有第一个字符相同的后缀都连续的排列在SA中的某一段区域,这段区域我们称之为对应这些后缀的一个桶。
3.根据权利要求2所述的后缀数组构造方法,其特征在于,所述步骤 4)中计算新字符串S1的过程包括:
41)从左向右扫描SA数组中已排序的所有LMS子串,依次比较相邻的两个LMS子串的大小,被比较的LMS子串从0开始编号命名,如果两个LMS子串相等,则编号一样,否则后者编号等于前者的编号加1;
42)把S中LMS子串用其在步骤41)中获取的编号来代替,所形成的新字符串即为S1。
4.根据权利要求3所述的后缀数组构造方法,其特征在于,所述步骤6)中从SA1归纳计算SA的步骤包括:
61)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA1数组,对每个扫描到的元素SA1[i], 则把P1[SA1[i]]放在后缀suf(S, P1[SA1[i]])在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格;
62)找出S中所有后缀在SA中所属各桶的起始位置,从左向右扫描SA数组,对于扫描到的每个不为-1的元素SA[i],如果S[SA[i]-1]是L型,则把SA[i]-1这个数值填入suf(S, SA[i]-1)这个后缀在SA中所属桶的当前起始位置,然后再把该桶的起始位置向右移动一格;
63)找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA数组, 对于扫描到的每个元素SA[i],如果S[SA[i]-1]是S型,则把SA[i]-1这个数值填入suf(S, SA[i]-1)这个后缀在SA中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011100290142A CN102081673A (zh) | 2011-01-27 | 2011-01-27 | 后缀数组构造方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011100290142A CN102081673A (zh) | 2011-01-27 | 2011-01-27 | 后缀数组构造方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102081673A true CN102081673A (zh) | 2011-06-01 |
Family
ID=44087634
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2011100290142A Pending CN102081673A (zh) | 2011-01-27 | 2011-01-27 | 后缀数组构造方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102081673A (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102521213A (zh) * | 2011-12-01 | 2012-06-27 | 农革 | 线性时间后缀数组构造方法 |
WO2015143708A1 (zh) * | 2014-03-28 | 2015-10-01 | 华为技术有限公司 | 后缀数组的构造方法及装置 |
CN105335481A (zh) * | 2015-10-14 | 2016-02-17 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种大规模字符串文本的后缀索引构造方法及装置 |
CN106953806A (zh) * | 2017-03-27 | 2017-07-14 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种基于后缀索引匹配ip地址的方法及*** |
CN107015952A (zh) * | 2017-03-24 | 2017-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组和最长公共前缀的正确性验证方法及*** |
CN107015951A (zh) * | 2017-03-24 | 2017-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组的正确性验证方法及*** |
CN107169315A (zh) * | 2017-03-27 | 2017-09-15 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种海量dna数据的传输方法及*** |
CN108664459A (zh) * | 2018-03-22 | 2018-10-16 | 佛山市顺德区中山大学研究院 | 一种后缀数组自适应的合并方法及其装置 |
CN108763170A (zh) * | 2018-04-17 | 2018-11-06 | 佛山市顺德区中山大学研究院 | 常数工作空间并行构造后缀数组的方法及*** |
CN108804204A (zh) * | 2018-04-17 | 2018-11-13 | 佛山市顺德区中山大学研究院 | 多线程并行构造后缀数组的方法及*** |
CN108920483A (zh) * | 2018-04-28 | 2018-11-30 | 南京搜文信息技术有限公司 | 基于后缀数组的字符串快速匹配方法 |
CN109299152A (zh) * | 2018-08-27 | 2019-02-01 | 中山大学 | 一种实时数据流的后缀数组索引方法及装置 |
-
2011
- 2011-01-27 CN CN2011100290142A patent/CN102081673A/zh active Pending
Cited By (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102521213A (zh) * | 2011-12-01 | 2012-06-27 | 农革 | 线性时间后缀数组构造方法 |
WO2015143708A1 (zh) * | 2014-03-28 | 2015-10-01 | 华为技术有限公司 | 后缀数组的构造方法及装置 |
CN105335481A (zh) * | 2015-10-14 | 2016-02-17 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种大规模字符串文本的后缀索引构造方法及装置 |
CN105335481B (zh) * | 2015-10-14 | 2019-01-22 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种大规模字符串文本的后缀索引构造方法及装置 |
CN107015951B (zh) * | 2017-03-24 | 2020-08-18 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组的正确性验证方法及*** |
CN107015952A (zh) * | 2017-03-24 | 2017-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组和最长公共前缀的正确性验证方法及*** |
CN107015951A (zh) * | 2017-03-24 | 2017-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组的正确性验证方法及*** |
CN107015952B (zh) * | 2017-03-24 | 2020-08-18 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组和最长公共前缀的正确性验证方法及*** |
CN107169315A (zh) * | 2017-03-27 | 2017-09-15 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种海量dna数据的传输方法及*** |
CN107169315B (zh) * | 2017-03-27 | 2020-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种海量dna数据的传输方法及*** |
CN106953806A (zh) * | 2017-03-27 | 2017-07-14 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种基于后缀索引匹配ip地址的方法及*** |
CN108664459B (zh) * | 2018-03-22 | 2021-09-17 | 佛山市顺德区中山大学研究院 | 一种后缀数组自适应的合并方法及其装置 |
CN108664459A (zh) * | 2018-03-22 | 2018-10-16 | 佛山市顺德区中山大学研究院 | 一种后缀数组自适应的合并方法及其装置 |
CN108763170A (zh) * | 2018-04-17 | 2018-11-06 | 佛山市顺德区中山大学研究院 | 常数工作空间并行构造后缀数组的方法及*** |
CN108804204A (zh) * | 2018-04-17 | 2018-11-13 | 佛山市顺德区中山大学研究院 | 多线程并行构造后缀数组的方法及*** |
CN108920483A (zh) * | 2018-04-28 | 2018-11-30 | 南京搜文信息技术有限公司 | 基于后缀数组的字符串快速匹配方法 |
CN109299152A (zh) * | 2018-08-27 | 2019-02-01 | 中山大学 | 一种实时数据流的后缀数组索引方法及装置 |
CN109299152B (zh) * | 2018-08-27 | 2021-11-30 | 中山大学 | 一种实时数据流的后缀数组索引方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102081673A (zh) | 后缀数组构造方法 | |
CN102073740A (zh) | 基于基数排序的字符串后缀数组构造方法 | |
KR101276602B1 (ko) | 표의문자적 내용을 가지는 데이터를 서치하고 매칭하기위한 시스템 및 방법 | |
CN101430714B (zh) | 一种基于样式的内容结构化加工方法及*** | |
CN109902142B (zh) | 一种基于编辑距离的字符串模糊匹配和查询方法 | |
CN111860981B (zh) | 一种基于lstm深度学习的企业国民行业类别预测方法及*** | |
CN108399213B (zh) | 一种面向用户个人文件的聚类方法及*** | |
CN105335481B (zh) | 一种大规模字符串文本的后缀索引构造方法及装置 | |
CN101158957A (zh) | 互联网热点主题相关性挖掘方法 | |
CN101477555B (zh) | 基于sql数据库的任务树的快速检索及生成显示的方法 | |
CN101251845B (zh) | 利用改进的Wu-Manber算法进行多模式串匹配的方法 | |
CN102521213A (zh) | 线性时间后缀数组构造方法 | |
CN108804204A (zh) | 多线程并行构造后缀数组的方法及*** | |
CN102081649A (zh) | 一种搜索电脑文件的方法及其*** | |
CN106295252A (zh) | 用于基因产品的检索方法 | |
US20100057809A1 (en) | Information storing/retrieving method and device for state transition table, and program | |
US20090138474A1 (en) | Method and apparatus for resorting a sequence of sorted strings | |
CN101853444A (zh) | 基于模型合并的集成化企业过程参考模型建立方法 | |
CN106126618A (zh) | 基于人名的邮箱地址推荐方法及*** | |
CN101034350A (zh) | 一种快速查找计算机程序功能入口的装置和方法 | |
CN108763170A (zh) | 常数工作空间并行构造后缀数组的方法及*** | |
CN101211347A (zh) | 一种搜索引擎和快速建立关键词组搜索关系的方法 | |
JPH1153383A (ja) | 複数データベースの検索方法及びその検索プログラム等を記録した記録媒体 | |
Ribeiro et al. | A framework for set similarity join on multi-attribute data | |
CN116028596B (zh) | 一种实体匹配分块的实现方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20110601 |