CN102521213A - 线性时间后缀数组构造方法 - Google Patents

线性时间后缀数组构造方法 Download PDF

Info

Publication number
CN102521213A
CN102521213A CN2011103936221A CN201110393622A CN102521213A CN 102521213 A CN102521213 A CN 102521213A CN 2011103936221 A CN2011103936221 A CN 2011103936221A CN 201110393622 A CN201110393622 A CN 201110393622A CN 102521213 A CN102521213 A CN 102521213A
Authority
CN
China
Prior art keywords
suffix
array
character
lms
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
Application number
CN2011103936221A
Other languages
English (en)
Inventor
农革
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sun Yat Sen University
Original Assignee
Individual
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Individual filed Critical Individual
Priority to CN2011103936221A priority Critical patent/CN102521213A/zh
Publication of CN102521213A publication Critical patent/CN102521213A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Compression, Expansion, Code Conversion, And Decoders (AREA)

Abstract

本发明提供了一种线性时间后缀数组构造方法,包括:1)从右向左扫描字符串S,比较当前两个相邻字符S[i]和S[i+1],得出每个字符和后缀的类型,记录于数组t[i];2)从左到右扫描t[i],找出所有LMS字符位置,获取所有LMS子串首字母指针,记录于数组P1;3)通过LMS子串指针数组P1、数组B和SA对S中所有的LMS子串进行排序,结果保存SA1中;4)重新命名字符串S中各个LMS子串,形成字符串T1,然后对T1各字符根据其L和S类型进行重命名,形成的新字符串保存到S1;5)判断S1每个字符是否唯一,如果是,则直接排序S1的各后缀来计算S1的后缀数组到SA1中,否则以S1和SA1作为输入参数返回1);6)根据保存于SA1中的S1的后缀数组归纳计算S的后缀数组到SA中;7)返回。

Description

线性时间后缀数组构造方法
技术领域
本发明涉及一种字符串后缀数组构造方法,具体来说,涉及一种通过计算机在最优的时空复杂度内自动完成字符串后缀数组构造的线性时间后缀数组构造方法。
背景技术
字符串后缀数组是为了克服后缀树占用空间过大而提出的一个替代数据结构【1,2】,可以在更小的空间内实现等同后缀树的算法,在数据索引和模式匹配等应用中有广泛用途。本发明的算法对常数字符集上定义的任何长度为n个字符的字符串S,可在线性时间O(n)、工作空间O(1)内构造S的后缀数组,其中的工作空间是总空间除去S及其后缀数组所用空间后的剩余部分,具有此时空复杂度的算法是该问题在理论上可达到的最优解。
本文的陈述采用以下术语:
字符集    一个字符集∑是一个建立了全序关系的集合,即∑中任意两个不同的元素α和β都可以比较大小,要么α<β,要么α>β。字符集∑中的元素称为字符,其中最小的字符为‘$’。本文所涉及的字符集大小为常数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开始到结束符$的一个子串。从字符S[i]开始的后缀表示为suf(S,i),即suf(S,i)=S[i,n-1]。
字符和后缀类型S中的字符和后缀分为L和S两种类型:
1)‘$’为S类型;
2)S[i],i∈[0,n-2]为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∈[0,n 2]为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]为LMS字符,i∈[1,n-1],当且仅当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个LMS子串的首字母在S中的位置,0≤i。
字符串大小比较两个字符串的大小比较,是指通常所说的“字典顺序”比较,亦即对于两个字符串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的后缀数组是一个包含n个整数的一维数组SA[0,n-1],其中每个元素指向S中的一个后缀,并且对于i∈[0,n-2]满足suf(S,SA[i])<suf(S,SA[i+1])。
利用以上术语,我们给出一个构造字符串后缀数组的例子如下。
字符串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 onlinestring searches,”in Proceedings of SODA,1990,pp.319-327.
2、U.Manber and G.Myers,“Suffix arrays:A new method for on-linestring 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 constructionof suffix arrays,”in Proceedings of CPM,2003,pp.186-199.
4、P.Ko and S.Aluru,“Space-efficient linear time construction of suffixarrays,”Journal of Discrete Algorithms,vol.3,no.2-4,pp.143-156,2005.
5、J.Karkkainen,P.Sanders,and S.Burkhardt,“Linear Work suffix arrayconstruction,”JACM,no.6,pp.918-936,Nov.2006.
6、G.Manzini and P.Ferragina,“Engineering a lightweight suffix arrayconstruction 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 suffixarray 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 lineartime suffix sorting algorithms,”in Proceedings of Data CompressionConference,Mar.2005,pp.358-367。
发明内容
针对以上的不足,本发明提供了一种线性时间后缀数组构造方法(OSACA),具有最优的时空性能,本发明对任意常数字符集上定义的长度为n个字符的字符串,可在线性时间O(n)、工作空间O(1)内构造其后缀数组,相比现存的其他线性时间后缀数组构造算法,本发明算法具有运行速度更快、耗用空间最小、简单易行的优点。
本发明的线性时间后缀数组构造方法包括:1)标记字符串中每个字符和后缀的类型,从右向左扫描一遍字符串S,按照后缀类型的定义比较当前扫描的两个相邻的字符S[i]和S[i+1],得出每个字符S[i]和后缀suf(S,i)的类型,记录于数组t[i];2)从左到右扫描一遍t[i],找出其中所有LMS字符出现的位置,从而获取所有LMS子串的首字母指针,用数组P1来记录每个LMS子串的指针;3)通过LMS子串指针数组P1、数组B和SA来对S中所有的LMS子串进行排序,结果保存在SA1中;4)根据步骤3)排序的结果重新命名字符串S中的各个LMS子串,形成字符串T1,然后对T1的字符根据其L和S类型进行重命名,形成的新字符串保存到S1;5)判断S1的每个字符是否唯一,如果是,则直接排序S1的各后缀来计算S1的后缀数组到SA1中,否则以S1和SA1作为输入参数,返回到步骤1);6)根据步骤5)中获得的保存于SA1中的S1的后缀数组归纳计算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)从左向右扫描SA1中已排好序的所有LMS子串,依次比较相邻的两个LMS子串的大小来找出所有的子串桶,每个子串用其所属桶在SA1中的开始位置命名,第一个桶的开始位置从0开始;
42)把S中每个LMS子串用其在步骤41)中获取的名字来代替,形成一个字符串T1,对T1的每个字符,当我们称其在SA1中所属的桶,意指该字符所对应在S中的LMS子串在SA1中的桶;
43)从右到左扫描T1一次来找出T1各个字符的类型,对每个被扫描到的字符T1[i],如果其为L型则令S1[i]=T1[i],否则将S1[i]设为T1[i]在SA1中所属桶的结束位置,扫描T1结束后,S1即为对T1中各S型字符重命名后的结果,
其中,所有相同的LMS子串在SA1中形成一个连续的区域,即在任意两个相同的LMS子串之间没有不同于这两个子串的其他子串,这个区域称之为一个子串桶。
所述步骤6)中计算S的后缀数组的步骤包括:
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中所属桶的当前结束位置,然后把该桶的结束位置向左移动一格。
其中,所有相同的LMS子串在SA1中形成一个连续的区域,即在任意两个相同的LMS子串之间没有不同于这两个子串的其他子串,这个区域称之为一个子串桶。
本发明的有益效果:本发明对任意常数字符集上定义的长度为n个字符的字符串,可在线性时间O(n)、工作空间O(1)内构造其后缀数组,相比现存的其他线性时间后缀数组构造算法,本发明算法具有运行速度更快、耗用空间最小、简单易行的优点。
附图说明
图1为本发明的线性时间后缀数组构造方法的流程图。
具体实施方式
下面结合附图对本发明进行进一步阐述。
如图1所示,本发明的线性时间后缀数组构造方法流程图中各步骤的伪代码给出如下,其中每个数组的元素以从左到右的方式存储,即第一个元素在最左边,最后一个元素在最右边。数组T1,S1,SA1,t,P1,B可以重用SA的空间,也可以是各自独立占用的空间,在此不作特定限制。
OSACA(S,SA)
S:输入字符串;/*长度为n个字符,包含n1个LMS子串*/
SA:整型数组;/*记录S的后缀数组,长度为n*/
T1,S1:整型数组;/*记录对S中各LMS子串重命名后形成的新字符串,长度各为n1*/
SA1:/*记录S1的后缀数组,长度为n1*/
t:布尔数组;/*记录S中每个字符的类型,长度为n*/
P1:整型数组;/*记录S中各LMS子串出现的位置,长度为n1*/
B:整型数组;/*排序时用到的辅助数组,长度为∑(S)(即S的字符集∑中元素的个数)*/
本发明的线性时间后缀数组构造方法的具体流程步骤为:
1)从右向左扫描一遍字符串S,按照后缀类型的定义比较当前扫描的字符S[i]及其后继字符S[i+1],得出每个字符S[i]和后缀suf(S,i)的类型,记录于t[i]。
2)从左到右扫描一遍t,找出其中所有LMS字符出现的位置,从而获取所有LMS子串的首字母指针,用P1来记录每个LMS子串的指针。
3)通过LMS子串指针数组P1、数组B和SA来对S中所有的LMS子串进行排序,结果保存在SA1中:
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中的某段区域,这段区域我们称之为对应这些后缀的一个桶。如果S中包含有m个不同的字符,则SA中会形成m个桶,每个桶中所包含的后缀的首字符都相同。如果一个桶所包含的后缀的首字符为‘x’,我们也简称该桶为字符‘x’桶。另外,当我们说把一个后缀放入SA中的一个单元,其含义是在SA中该单元记录此后缀在S中的位置。
4)根据步骤3)排序的结果重新命名字符串S中的各个LMS子串,形成字符串T1,然后对T1的字符根据其L和S类型进行重命名,形成的新字符串保存到S1:
41)因为此时S的所有LMS子串已经在SA1排序,则所有相同的LMS子串在SA1中形成一个连续的区域,即在任意两个相同的LMS子串之间没有不同于这两个子串的其他子串,这个区域称之为一个子串桶。从左向右扫描SA1中已排好序的所有LMS子串,依次比较相邻的两个LMS子串的大小来找出所有的子串桶。每个子串用其所属桶在SA1中的开始位置命名,第一个桶的开始位置从0开始。
42)把S中每个LMS子串用其在步骤4.1获取的名字来代替,形成一个字符串T1。对T1的每个字符,当我们称其在SA1中所属的桶,意指该字符所对应在S中的LMS子串在SA1中的桶(在步骤4.1中定义)。
43)从右到左扫描T1一次来找出T1各个字符的类型,对每个被扫描到的字符T1[i],如果其为L型则令S1[i]=T1[i],否则将S1[i]设为T1[i]在SA1中所属桶的结束位置。扫描T1结束后,S1即为对T1中各S型字符重命名后的结果。
5)判断S1的每个字符是否唯一,如果是,则直接排序S1的各后缀来计算S1的后缀数组到SA1中,否则以S1和SA1作为输入参数,返回到步骤1)。
6根据步骤5)中获得的保存于SA1中的S1的后缀数组归纳计算S的后缀数组到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中所属桶的当前结束位置,然后把该桶的结束位置向左移动一格。
7)返回。
本发明的具体运行示例如下:
我们以字符串S=“ocococonut$”为例,给出OSACA算法中从S计算新字符串S1的详细过程,以帮助理解本发明的细节。首先给出各步运算结果如下:
00       0                   1
01 索引:0 1 2 3 4 5 6 7 8 9 0
02    S:o c o c o c o n u t $
03 类型:L S L S L S L S L L S
04  LMS:  *   *   *   *     *
05 LMS子串:{coc,coc,con,nut$,$}
06 各LMS子串的排序结果为{$,coc,coc,con,nut$},通过在SA1中记录各子串在S中的位置索引来记录,结果为SA1[10,1,3,5,7]
07 SA1中的桶:{(10),(1,3),(5),(7)}
08 S中各LMS子串的名字,以“子串-名字”的形式记录如后:
{$-0,coc-1,con-3,nut$-4}
09 T1:1 1 3 4 0
10     S S S L S
11 重命名T1中的S型字符,在S1中得到新字符串:2 2 3 4 0
以上各步骤说明如下:
步骤1,计算字符串S中每个字符类型。首先‘$’是S型,然后从右向左扫描一遍字符串S,按照后缀类型的定义比较当前扫描的字符S[i]和它的后继字符S[i+1],得出字符S[i]的类型:若S[i]>S[i+1],则S[i]为L型;若S[i]<S[i+1],则S[i]为S型;若S[i]=S[i+1],S[i]和S[i+1]的类型相同。各字符的类型在03行标出。
步骤2,求出S中各LMS子串位置,结果即为04行用‘*’号标记出的位置,所有的LMS子串按其在S中的位置从左到右在05行列出。
步骤3,把步骤2中发现的所有LMS子串进行排序,结果保存在SA1中,如06行所示。
步骤4,从左向右扫描SA1中已排序的所有LMS子串,找出所有的子串桶,结果如07行所示,其中每个子串桶用一对左右括号来标记。总共有4个桶,除了第2个桶有两个子串,其他3个都只有一个子串,这4个桶按其在SA1中从左到右的开始位置分别为0,1,3,4。用每个桶的开始位置来命名桶中各子串,结果在08行给出;然后对S中各子串用其名字来替换,形成09行所示的字符串T1。
步骤5,从右到左扫描T1一次来找出T1中所有的S型字符,对每个被扫描到的S型字符,用其在SA1中所属桶的结束位置来重新命名。T1中各个字符的类型在10行给出,从中可见属于S型的字符为T1[0],T1[1],T1[2],T1[4]。因为T1[0]和T1[1]属于07行SA1中的第2个桶,故用该桶的结束位置2来重命名T1[0]和T1[1]。对T1[2]和T1[4]而言,它们分别属于07行SA1中的第3和第1个桶,并且每个桶只有一个子串,故开始和结束位置相同,因此T1[2]和T1[4]保持不变。重命名T1中的所有S型字符后,得出保存在S1中的新字符串如11行所示。
以上所述仅为本发明的较佳实施方式,本发明并不局限于上述实施方式,在实施过程中可能存在局部微小的结构改动,如果对本发明的各种改动或变型不脱离本发明的精神和范围,且属于本发明的权利要求和等同技术范围之内,则本发明也意图包含这些改动和变型。

Claims (4)

1.一种线性时间后缀数组构造方法,其特征在于,它包括:
1)标记字符串中每个字符和后缀的类型,从右向左扫描一遍字符串S,按照后缀类型的定义比较当前扫描的两个相邻的字符S[i]和S[i+1],得出每个字符S[i]和后缀suf(S,i)的类型,记录于数组t[i];
2)从左到右扫描一遍t[i],找出其中所有LMS字符出现的位置,从而获取所有LMS子串的首字母指针,用数组P1来记录每个LMS子串的指针;
3)通过LMS子串指针数组P1、数组B和SA来对S中所有的LMS子串进行排序,结果保存在SA1中;
4)根据步骤3)排序的结果重新命名字符串S中的各个LMS子串,形成字符串T1,然后对T1的字符根据其L和S类型进行重命名,形成的新字符串保存到S1;
5)判断S1的每个字符是否唯一,如果是,则直接排序S1的各后缀来计算S1的后缀数组到SA1中,否则以S1和SA1作为输入参数,返回到步骤1);
6)根据步骤5)中获得的保存于SA1中的S1的后缀数组归纳计算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.根据权利要求1所述的线性时间后缀数组构造方法,其特征在于,所述步骤4)中计算新字符串S1的步骤包括:
41)从左向右扫描SA1中已排好序的所有LMS子串,依次比较相邻的两个LMS子串的大小来找出所有的子串桶,每个子串用其所属桶在SA1中的开始位置命名,第一个桶的开始位置从0开始;
42)把S中每个LMS子串用其在步骤41)中获取的名字来代替,形成一个字符串T1,对T1的每个字符,当我们称其在SA1中所属的桶,意指该字符所对应在S中的LMS子串在SA1中的桶;
43)从右到左扫描T1一次来找出T1各个字符的类型,对每个被扫描到的字符T1[i],如果其为L型则令S1[i]=T1[i],否则将S1[i]设为T1[i]在SA1中所属桶的结束位置,扫描T1结束后,S1即为对T1中各S型字符重命名后的结果,
其中,所有相同的LMS子串在SA1中形成一个连续的区域,即在任意两个相同的LMS子串之间没有不同于这两个子串的其他子串,这个区域称之为一个子串桶。
4.根据权利要求1所述的线性时间后缀数组构造方法,其特征在于,所述步骤6)中计算S的后缀数组的步骤包括:
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中所属桶的当前结束位置,然后把该桶的结束位置向左移动一格。
CN2011103936221A 2011-12-01 2011-12-01 线性时间后缀数组构造方法 Pending CN102521213A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2011103936221A CN102521213A (zh) 2011-12-01 2011-12-01 线性时间后缀数组构造方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2011103936221A CN102521213A (zh) 2011-12-01 2011-12-01 线性时间后缀数组构造方法

Publications (1)

Publication Number Publication Date
CN102521213A true CN102521213A (zh) 2012-06-27

Family

ID=46292142

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2011103936221A Pending CN102521213A (zh) 2011-12-01 2011-12-01 线性时间后缀数组构造方法

Country Status (1)

Country Link
CN (1) CN102521213A (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105335481A (zh) * 2015-10-14 2016-02-17 广东顺德中山大学卡内基梅隆大学国际联合研究院 一种大规模字符串文本的后缀索引构造方法及装置
CN107015952A (zh) * 2017-03-24 2017-08-04 广东顺德中山大学卡内基梅隆大学国际联合研究院 一种后缀数组和最长公共前缀的正确性验证方法及***
CN107169315A (zh) * 2017-03-27 2017-09-15 广东顺德中山大学卡内基梅隆大学国际联合研究院 一种海量dna数据的传输方法及***
CN108763170A (zh) * 2018-04-17 2018-11-06 佛山市顺德区中山大学研究院 常数工作空间并行构造后缀数组的方法及***
CN108804204A (zh) * 2018-04-17 2018-11-13 佛山市顺德区中山大学研究院 多线程并行构造后缀数组的方法及***

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102073740A (zh) * 2011-01-27 2011-05-25 农革 基于基数排序的字符串后缀数组构造方法
CN102081673A (zh) * 2011-01-27 2011-06-01 农革 后缀数组构造方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102073740A (zh) * 2011-01-27 2011-05-25 农革 基于基数排序的字符串后缀数组构造方法
CN102081673A (zh) * 2011-01-27 2011-06-01 农革 后缀数组构造方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
GE NONG ET AL: "Computing the Inverse Sort Transform in Linear Time", 《ACM TRANSACTIONS ON ALGORITHMS》 *
GE NONG ET AL: "Two Efficient Algorithms for Linear Time Suffix Array Construction", 《IEEE TRANSACTIONS ON COMPUTERS》 *
JUHA KARKKAINEN ET AL: "Linear Work Suffix Array Construction", 《JOURNAL OF THE ACM》 *

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105335481A (zh) * 2015-10-14 2016-02-17 广东顺德中山大学卡内基梅隆大学国际联合研究院 一种大规模字符串文本的后缀索引构造方法及装置
CN105335481B (zh) * 2015-10-14 2019-01-22 广东顺德中山大学卡内基梅隆大学国际联合研究院 一种大规模字符串文本的后缀索引构造方法及装置
CN107015952A (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数据的传输方法及***
CN108763170A (zh) * 2018-04-17 2018-11-06 佛山市顺德区中山大学研究院 常数工作空间并行构造后缀数组的方法及***
CN108804204A (zh) * 2018-04-17 2018-11-13 佛山市顺德区中山大学研究院 多线程并行构造后缀数组的方法及***

Similar Documents

Publication Publication Date Title
CN102081673A (zh) 后缀数组构造方法
KR101190230B1 (ko) 정보 검색 시스템에서의 문구 식별
CN102073740A (zh) 基于基数排序的字符串后缀数组构造方法
KR101223172B1 (ko) 정보 검색 시스템에서의 문구 기반 서치
KR101176079B1 (ko) 문서 설명의 문구 기반 생성
Han et al. Solving the blocking flow shop scheduling problem with makespan using a modified fruit fly optimisation algorithm
CN106528599B (zh) 一种海量音频数据中的字符串快速模糊匹配算法
CN110134714B (zh) 适用于大数据迭代计算的分布式计算框架缓存索引方法
CN104111973B (zh) 一种学者重名的消歧方法及其***
Ma et al. Big graph search: challenges and techniques
CN104462582B (zh) 一种基于结构和内容二级过滤的Web数据相似性检测方法
CN108897842A (zh) 计算机可读存储介质及计算机***
CN102521213A (zh) 线性时间后缀数组构造方法
CN108399213B (zh) 一种面向用户个人文件的聚类方法及***
CN105335481B (zh) 一种大规模字符串文本的后缀索引构造方法及装置
CN102043793A (zh) 一种面向知识服务的推荐方法
CN101477555B (zh) 基于sql数据库的任务树的快速检索及生成显示的方法
CN102169491A (zh) 一种多数据集中重复记录动态检测方法
Hao et al. Research on parallel association rule mining of big data based on an improved K-means clustering algorithm
CN112835923A (zh) 一种相关检索方法、装置和设备
Jiang et al. GRIAS: an entity-relation graph based framework for discovering entity aliases
CN115982390A (zh) 一种产业链构建和迭代扩充开发方法
CN108763170A (zh) 常数工作空间并行构造后缀数组的方法及***
JP2004145692A (ja) データ処理方法およびデータ処理プログラム
CN112507181B (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
C41 Transfer of patent application or patent right or utility model
TA01 Transfer of patent application right

Effective date of registration: 20160229

Address after: 510275 Xingang West Road, Guangdong, China, No. 135, No.

Applicant after: Sun Yat-sen University

Address before: 510630 Department of computer science, Zhongshan University, 132 East Ring Road, University of Guangdong, Guangzhou

Applicant before: Nong Ge

RJ01 Rejection of invention patent application after publication

Application publication date: 20120627

RJ01 Rejection of invention patent application after publication