CN102073740A - 基于基数排序的字符串后缀数组构造方法 - Google Patents
基于基数排序的字符串后缀数组构造方法 Download PDFInfo
- Publication number
- CN102073740A CN102073740A CN2011100290138A CN201110029013A CN102073740A CN 102073740 A CN102073740 A CN 102073740A CN 2011100290138 A CN2011100290138 A CN 2011100290138A CN 201110029013 A CN201110029013 A CN 201110029013A CN 102073740 A CN102073740 A CN 102073740A
- Authority
- CN
- China
- Prior art keywords
- suffix
- array
- character
- weighting
- substring
- 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,找出所有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)返回。
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中。
d-字符字符串S中的字符S[i]是d-字符,d≥2,当且仅当满足以下条件:
1)S[i]是一个LMS字符;或者
2)S[i-d]是d-字符,S[i+1]不是LMS字符,并且子串S[i-d+1..i-1]内没有d-字符。
d-子串对S中的每个d-字符S[i],d≥2和i<n-d-1,子串S[i..i+d+1]称为一个d-子串。如果i≥n-d-1,则S[i..i+d+1]=S[i..n-2]{S[n-1]}d+1-(n-2-i),其中{S[n-1]}x表示把字符S[n-1]重复x次所构成的字符串。
指针数组指针数组P1记录字符串S中所有d-子串的首字母所在的位置,即P1[i]记录字符串S中(从左到右)第i+1个d-子串的首字母在S中的位置。
加权字符字符串S中的字符S[i]的加权字符定义为Sw[i]=2S[i]+t[i]。
d-加权子串字符串S中的d-子串S[i..j]的加权子串定义为Sv[i..j]=S[i..j-1]Sw[j]。
利用以上术语,我们给出一个构造字符串后缀数组的例子如下。
字符串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,”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 ofsuffix 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-367。
发明内容
针对以上的不足,本发明提供了一种新型的线性时间的基于基数排序的字符串后缀数组构造方法SA-DS),可以有效克服现存线性时间后缀数组构造方法的缺点。它包括:
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算法,即SA-DS(S1,SA1);
6)根据5)中获得的S1的后缀数组SA1归纳计算S的后缀数组SA;
7)返回。
所述步骤3)中对S中所有d-加权子串进行基数排序的过程包括:
31)对所有d-加权子串的最后一个字符进行两轮基数排序:先根据每个字符的类型进行基数排序,然后再根据每个字符的大小进行基数排序;
32)在步骤31)的排序结果上,继续对所有d-加权子串根据它们的前d+1个字符进行基数排序:从每个d-加权子串的倒数第二个字符开始到第一个字符结束,每轮根据一个字符排序,总共排d+1轮。
所述步骤4)中计算新字符串S1的步骤包括:
41)从左向右扫描SA数组中已排序的所有d-加权子串,依次比较相邻的两个d-加权子串的大小,被比较的d-加权子串从0开始编号命名,如果两个d-加权子串相等,则编号一样,否则后者编号等于前者的编号加1;
42)把S中各个d-加权子串用其在步骤41)中获取的编号来代替,所形成的新字符串即为S1。
所述步骤6)中从SA1归纳计算SA的过程如下:
61)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA1数组,对每个扫描到的元素SA1[i],如果suf(S,P1[SA1[i]])是LMS后缀,则把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中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格,
其中,把字符串S的所有后缀按其第一个字符在数组SA中进行排序,则所有第一个字符相同的后缀都连续排列在SA中的某一段区域,这段区域我们称之为对应这些后缀的一个桶。
本发明的有益效果:本发明的基于基数排序的字符串后缀数组构造方法可以在线性时间O(n)内对长度为n的字符串构造其后缀数组,相比现存的其他线性时间后缀数组构造方法,本发明的方法具有运行速度快、耗用空间小、容易实现的优点。
附图说明
图1为本发明基于基数排序的字符串后缀数组构造方法的流程图。
具体实施方式
下面结合附图对本发明进行进一步阐述。
如图1所示,本发明的基于基数排序的字符串后缀数组构造方法的流程图中各步骤的伪代码给出如下,其中每个数组的元素以从左到右的方式存储,即第一个元素在最左边,最后一个元素在最右边。
根据d-子串的定义,我们知道每个d-子串的长度都是固定为d+2个字符,其中d≥2,因此,对S中所有定长d-子串进行排序时可以利用简单快速的基数排序算法。相比其他线性时间后缀数组构造算法,这个特点是本发明方法的一个独特优点。
SA-IS(S,SA)
S:输入字符串;(长度为n个字符,包含n1个d-子串)
SA:S的后缀数组;
S1:整型数组;(记录对S中各d-子串重命名后形成的新字符串,长度为n1)
SA1:S1的后缀数组
t:布尔数组;(记录S中每个字符的类型,长度为n)
P1:整型数组;(记录S中各d-子串出现的位置,长度为n1)
B:整型数组;(排序时用到的辅助数组,长度为||∑(S)||(即字符集∑中元素的个数))
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算法,即SA-DS(S1,SA1);
6)根据步骤5)中获得的S1的后缀数组SA1归纳计算S的后缀数组SA;
7)返回。
下面对上述步骤3)、4)h和6)的细节进行进一步描述,为方便叙述,首先引入一个概念“桶”,把字符串S的所有后缀按其第一个字符在数组SA中进行排序,则所有第一个字符相同的后缀都连续排列在SA中的某一段区域,这段区域我们称之为对应这些后缀的一个桶。如果S中包含有m个不同的字符,则SA中会形成m个桶,每个桶中所包含的后缀的首字符都相同。如果一个桶所包含的后缀的首字符为‘y’,我们也简称该桶为字符‘y’桶。另外,当我们说把一个后缀放入SA中的一个单元,其含义是在SA中该单元记录此后缀在S中的位置。
步骤3)中对S中所有d-加权子串进行基数排序的步骤如下:
31)对所有d-加权子串的最后一个字符进行两轮基数排序:(1)先根据每个字符的类型进行基数排序;(2)然后再根据每个字符的大小进行基数排序;
32)在步骤31的排序结果上,继续对所有d-加权子串根据它们的前d+1个字符进行基数排序:从每个d-加权子串的倒数第二个字符开始到第一个字符结束,每轮根据一个字符排序,总共排d+1轮。
步骤4)中计算新字符串S1的步骤如下:
41)从左向右扫描SA数组中已排序的所有d-加权子串,依次比较相邻的两个d-加权子串的大小,被比较的d-加权子串从0开始编号命名,如果两个d-加权子串相等,则编号一样,否则后者编号等于前者的编号加1。
42)把S中各个d-加权子串用其在步骤41)中获取的编号来代替,所形成的新字符串即为S1。
步骤6)中从SA1归纳计算SA的流程如下:
61)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA1数组,对每个扫描到的元素SA1[i],如果suf(S,P1[SA1[i]])是LMS后缀,则把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$”和d=2为例,给出SA-DS算法从S计算其后缀数组SA的详细过程,以帮助理解本发明的细节。首先给出各步运算结果如下:
递归层次:0
注释:扫描S计算数组t和P1
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:0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1
04 P1:2 4 6 8 1 0 12 14 16
注释:对P1中的d-加权子串进行基数排序和命名以产生S1
05第1轮:14 16 12 4 8 10 2 6
06第2轮:14 16 12 4 8 10 2 6
07第3轮:16 14 10 2 6 12 4 8
08第4轮:16 14 10 2 6 12 4 8
09 S1: 3 5 3 5 2 4 1 0
递归层次:1
注释:扫描S计算数组t和P1
10索引:0 1 2 3 4 5 6 7
11 S:3 5 3 5 2 4 1 0
12 t:1 0 1 0 1 0 0 1
13 P1:2 4 7
注释:对P1中的d-加权子串进行基数排序和命名以产生S1
14第1轮:4 7 2
15第2轮:7 4 2
16第3轮:7 4 2
17第4轮:7 4 2
18 S1:2 1 0
19S A1:2 1 0
递归结束,开始回溯
递归层次:1
注释:从SA1归纳排序出SA
20 索引:0 1 2 3 4 5 6 7
21 SA1:2 1 0
22第1步:7 -1 4 -1 2 -1 -1 -1
23第2步:7 6 4 -1 2 5 3 1
24第3步:7 6 4 2 0 5 3 1
递归层次:0
注释:从SA1归纳排序出SA
1
25 索引: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
26 SA1: 7 6 4 2 0 5 3 1
27第1步:16 -1 -1 -1 -1 -1 10 6 2 -1 -1 -1 -1 -1 -1 -1 -1
28第2步:16 15 14 -1 -1 -1 10 6 2 1 0 13 12 9 5 8 4
29第3步:16 15 14 10 6 2 1 1 7 3 10 13 12 9 5 8 4
以上各步骤说明如下。
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中各d-子串位置。从左往右扫描字符类型数组t,标记出各个d-子串位置,并按它们在S中的位置从左到右依次记录在第4行的数组P1中。对应的d-子串为{iiss(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(2),iiss(6),ppii(12),ssii(4),ssii(8)}。
4)对已排序的d-加权子串进行编号命名,可得结果为{0,1,2,3,3,4,5,5}。再把S中各d-子串用他们的编号代替,得到在第9行给出的新字符串S1=[3,5,3,5,2,4,1,0]。
5)由于S1中有相同的字符,故以S1和SA1为参数递归调用SA-DS(S1,SA1),进入递归层次1。在第18行,由于S1中的字符各不相同,故直接排序S1的各后缀,在第19行得到S1的后缀数组SA1。
6)第20-24行是在递归层次1上从SA1归纳排序出SA。此层次上的S为递归层次0上的S1,即第9行给出的S1;而此层次上的P1在第13行给出,SA1在19行给出。换言之,在此递归层次有S=[3,5,3,5,2,4,1,0],P1=[2,4,7],SA1=[2,1,0]。
1)在第21行先初始化SA的所有元素为-1。然后找出各后缀桶的结束位置,再从右向左扫描SA1。因为SA1[2]=0,则查看P1[0]的值为2,由于S[2]是LMS字符,则把位置2放入后缀suf(S,2)在SA中所属桶的当前结束位置,此处为SA[4],并把该桶的结束位置向左移一格。完成扫描SA1后,S的所有LMS子串都放在其所属桶的末端,如第22行所示。
2)在第23行先找出S中所有后缀在SA中所属各桶的起始位置,然后从左向右扫描SA数组。因为SA[0]=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-1]不是L型,也跳过。如此完成扫描SA1后,S的所有L类型的后缀都放在SA内其所属桶的前端,第23行所示。
3)在第24行先找出S中所有后缀在SA中所属各桶的结束位置,然后从右向左扫描SA数组。因为SA[7]=1,并且S[1-1]是S型,则把1-1=0这个数值填入后缀suf(S,0)在SA中所属桶的当前结束位置,此处为SA[4],然后再把这个桶的结束位置向左移动一格。扫描到SA[6]=3时,因为S[3-1]是S型,则把3-1=2这个数值填入后缀suf(S,2)在SA中所属桶的当前结束位置,此处为SA[3],然后再把这个桶的结束位置向左移动一格。继续扫描到SA[2]=4时,因为S[4-1]不是S型,则跳过。如此完成扫描SA1后,S的所有后缀都放在各自所属桶,如第24行所示。
第25-29行是在递归层次0上从SA1归纳排序出SA,其运算过程与第20-24行类似。第29行是最后输出的后缀数组。
以上所述仅为本发明的较佳实施方式,本发明并不局限于上述实施方式,在实施过程中可能存在局部微小的结构改动,如果对本发明的各种改动或变型不脱离本发明的精神和范围,且属于本发明的权利要求和等同技术范围之内,则本发明也意图包含这些改动和变型。
Claims (4)
1.一种基于基数排序的字符串后缀数组构造方法,其特征在于,它包括:
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算法,即SA-DS(S1, SA1);
6)根据5)中获得的S1的后缀数组 SA1归纳计算S的后缀数组SA;
7)返回。
2.根据权利要求1所述的基于基数排序的字符串后缀数组构造方法,其特征在于,所述步骤 3)中对S中所有d-加权子串进行基数排序的过程包括:
31)对所有d-加权子串的最后一个字符进行两轮基数排序:先根据每个字符的类型进行基数排序,然后再根据每个字符的大小进行基数排序;
32)在步骤31)的排序结果上,继续对所有d-加权子串根据它们的前d+1个字符进行基数排序:从每个d-加权子串的倒数第二个字符开始到第一个字符结束,每轮根据一个字符排序,总共排d+1轮。
3.根据权利要求2所述的基于基数排序的字符串后缀数组构造方法,其特征在于,所述步骤 4)中计算新字符串S1的步骤包括:
41)从左向右扫描SA数组中已排序的所有d-加权子串,依次比较相邻的两个d-加权子串的大小,被比较的d-加权子串从0开始编号命名,如果两个d-加权子串相等,则编号一样,否则后者编号等于前者的编号加1;
42)把S中各个d-加权子串用其在步骤41)中获取的编号来代替,所形成的新字符串即为S1。
4.根据权利要求3所述的基于基数排序的字符串后缀数组构造方法,其特征在于,所述步骤 6)中从SA1归纳计算SA的过程如下:
61)初始化SA的所有元素为-1,找出S中所有后缀在SA中所属各桶的结束位置,从右向左扫描SA1数组,对每个扫描到的元素SA1[i], 如果suf(S, P1[SA1[i]])是LMS后缀,则把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中所属桶的当前结束位置,然后再把该桶的结束位置向左移动一格,
其中,把字符串S的所有后缀按其第一个字符在数组SA中进行排序,则所有第一个字符相同的后缀都连续排列在SA中的某一段区域,这段区域我们称之为对应这些后缀的一个桶。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011100290138A CN102073740A (zh) | 2011-01-27 | 2011-01-27 | 基于基数排序的字符串后缀数组构造方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011100290138A CN102073740A (zh) | 2011-01-27 | 2011-01-27 | 基于基数排序的字符串后缀数组构造方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102073740A true CN102073740A (zh) | 2011-05-25 |
Family
ID=44032279
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2011100290138A Pending CN102073740A (zh) | 2011-01-27 | 2011-01-27 | 基于基数排序的字符串后缀数组构造方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102073740A (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 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种大规模字符串文本的后缀索引构造方法及装置 |
CN105653567A (zh) * | 2014-12-04 | 2016-06-08 | 南京理工大学常熟研究院有限公司 | 一种文本序列数据中快速查找特征字符串的方法 |
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 | 南京搜文信息技术有限公司 | 基于后缀数组的字符串快速匹配方法 |
-
2011
- 2011-01-27 CN CN2011100290138A patent/CN102073740A/zh active Pending
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102521213A (zh) * | 2011-12-01 | 2012-06-27 | 农革 | 线性时间后缀数组构造方法 |
WO2015143708A1 (zh) * | 2014-03-28 | 2015-10-01 | 华为技术有限公司 | 后缀数组的构造方法及装置 |
CN105653567A (zh) * | 2014-12-04 | 2016-06-08 | 南京理工大学常熟研究院有限公司 | 一种文本序列数据中快速查找特征字符串的方法 |
CN105335481B (zh) * | 2015-10-14 | 2019-01-22 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种大规模字符串文本的后缀索引构造方法及装置 |
CN105335481A (zh) * | 2015-10-14 | 2016-02-17 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种大规模字符串文本的后缀索引构造方法及装置 |
CN107015952A (zh) * | 2017-03-24 | 2017-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组和最长公共前缀的正确性验证方法及*** |
CN107015951A (zh) * | 2017-03-24 | 2017-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组的正确性验证方法及*** |
CN107015952B (zh) * | 2017-03-24 | 2020-08-18 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组和最长公共前缀的正确性验证方法及*** |
CN107015951B (zh) * | 2017-03-24 | 2020-08-18 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组的正确性验证方法及*** |
CN106953806A (zh) * | 2017-03-27 | 2017-07-14 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种基于后缀索引匹配ip地址的方法及*** |
CN107169315B (zh) * | 2017-03-27 | 2020-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种海量dna数据的传输方法及*** |
CN107169315A (zh) * | 2017-03-27 | 2017-09-15 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种海量dna数据的传输方法及*** |
CN108664459A (zh) * | 2018-03-22 | 2018-10-16 | 佛山市顺德区中山大学研究院 | 一种后缀数组自适应的合并方法及其装置 |
CN108664459B (zh) * | 2018-03-22 | 2021-09-17 | 佛山市顺德区中山大学研究院 | 一种后缀数组自适应的合并方法及其装置 |
CN108804204A (zh) * | 2018-04-17 | 2018-11-13 | 佛山市顺德区中山大学研究院 | 多线程并行构造后缀数组的方法及*** |
CN108763170A (zh) * | 2018-04-17 | 2018-11-06 | 佛山市顺德区中山大学研究院 | 常数工作空间并行构造后缀数组的方法及*** |
CN108920483A (zh) * | 2018-04-28 | 2018-11-30 | 南京搜文信息技术有限公司 | 基于后缀数组的字符串快速匹配方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102073740A (zh) | 基于基数排序的字符串后缀数组构造方法 | |
CN102081673A (zh) | 后缀数组构造方法 | |
CN102866782B (zh) | 一种提高整句生成效率的输入法和输入法*** | |
Lu et al. | String similarity measures and joins with synonyms | |
US20070294235A1 (en) | Hashed indexing | |
CN101398820A (zh) | 一种大规模关键词匹配方法 | |
CN100354863C (zh) | 大规模关键词匹配的方法和*** | |
CN101477555B (zh) | 基于sql数据库的任务树的快速检索及生成显示的方法 | |
CN102081649B (zh) | 一种搜索电脑文件的方法及其*** | |
CN103294820B (zh) | 基于语义扩展的web页面归类方法和*** | |
CN109918682A (zh) | 一种文本标注方法及装置 | |
CN103064841A (zh) | 检索装置和检索方法 | |
CN102521213A (zh) | 线性时间后缀数组构造方法 | |
Mabroukeh et al. | Using domain ontology for semantic web usage mining and next page prediction | |
Li et al. | Toward less hidden cost of code completion with acceptance and ranking models | |
CN106295252A (zh) | 用于基因产品的检索方法 | |
CN107133321B (zh) | 页面的搜索特性的分析方法和分析装置 | |
Yu et al. | Concept extraction for structured text using entropy weight method | |
CN111984673A (zh) | 一种电网电能量计量***树形结构模糊检索方法和装置 | |
Lu et al. | Boosting the quality of approximate string matching by synonyms | |
CN110457531A (zh) | 一种基于OpenMP的并行字符串查询方法 | |
CN101211347A (zh) | 一种搜索引擎和快速建立关键词组搜索关系的方法 | |
CN108763170A (zh) | 常数工作空间并行构造后缀数组的方法及*** | |
CN110008994A (zh) | 基于Spark平台运行的P-CFSFDP密度聚类方法 | |
Wang et al. | Construction method of domain knowledge graph based on big data-driven |
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: 20110525 |