CN108763170A - 常数工作空间并行构造后缀数组的方法及*** - Google Patents

常数工作空间并行构造后缀数组的方法及*** Download PDF

Info

Publication number
CN108763170A
CN108763170A CN201810344030.2A CN201810344030A CN108763170A CN 108763170 A CN108763170 A CN 108763170A CN 201810344030 A CN201810344030 A CN 201810344030A CN 108763170 A CN108763170 A CN 108763170A
Authority
CN
China
Prior art keywords
character string
suffix
character
parallel
recorded
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
CN201810344030.2A
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
SYSU CMU Shunde International Joint Research Institute
Research Institute of Zhongshan University Shunde District Foshan
Original Assignee
Sun Yat Sen University
SYSU CMU Shunde International Joint Research Institute
Research Institute of Zhongshan University Shunde District Foshan
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 Sun Yat Sen University, SYSU CMU Shunde International Joint Research Institute, Research Institute of Zhongshan University Shunde District Foshan filed Critical Sun Yat Sen University
Priority to CN201810344030.2A priority Critical patent/CN108763170A/zh
Publication of CN108763170A publication Critical patent/CN108763170A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/10Text processing
    • G06F40/12Use of codes for handling textual entities
    • G06F40/126Character encoding

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Health & Medical Sciences (AREA)
  • Artificial Intelligence (AREA)
  • Audiology, Speech & Language Pathology (AREA)
  • Computational Linguistics (AREA)
  • General Health & Medical Sciences (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了常数工作空间并行构造后缀数组的方法及***,通过获取字符串X中所有LMS子串的首字符指针并记录在数组P1中,以进一步利用P1和SA来对字符串X中所有的LMS子串进行常数工作空间内的并行归纳排序,得到字符串X1,并依据X1中字符的唯一性来区别SA的不同构造输入参数,最终通过X1与其后缀数组SA1的对应关系得以在常数工作空间内并行归纳计算字符串X的后缀数组到SA中。本发明降低了计算机内存要求且运行速度更快,使时空复杂度达到最优,适用于大规模字符串的后缀数组构建。

Description

常数工作空间并行构造后缀数组的方法及***
技术领域
本发明涉及字符串后缀数组构造领域,尤其是常数工作空间并行构造后缀数组的方法及***。
背景技术
后缀数组(Suffix Array,SA)是后缀树(Suffix Tree,ST)的一个节省空间的替代型数据结构,具有结构紧凑且空间占用小的特点,可以在更小的空间内实现等同于后缀树的算法。后缀数组通常用来索引字符串,可以解决诸多关于字符串的处理任务,在全文索引和基因匹配等应用中有广泛用途。
近年来,通用计算机的内存空间不断增大,使得在内存模型上快速处理大规模的文本和基因数据变成了可能。随着数据规模的爆发式增长,现有的串行方法及***已无法满足大规模字符串数据的快速处理需求,即运行速度较慢,并且其需要较大的内存空间条件,对于某些内存相对较小的计算机***而言就不适用了,总而言之,虽然仍可以实现字符串的后缀数组构建,但其时空复杂度处在一个较差标准。
发明内容
为了解决上述问题,本发明的目的是提供常数工作空间并行构造后缀数组的方法及***,降低了内存要求且运行速度更快,使时空复杂度达到最优,适用于大规模字符串的后缀数组构建。
为了弥补现有技术的不足,本发明采用的技术方案是:
常数工作空间并行构造后缀数组的方法,包括以下步骤:
S1、从右向左扫描一遍输入的字符串X,按照后缀类型的定义比较当前扫描的两个相邻字符X[i]和X[i+1],从而得到每一个字符和后缀的类型;
在扫描过程中,按照LMS子串的S+L+S类型模式定义找出所有LMS字符出现的位置,从而获取字符串X中所有LMS子串的首字符指针,并记录在数组P1中;
S2、通过数组P1和SA来对字符串X中所有的LMS子串进行常数工作空间内的并行归纳排序,并将排序结果保存在SA1中;
其中,SA为用于记录字符串X的后缀数组;SA1为用于记录排序结果的后缀数组;
S3、根据排序结果在常数工作空间内并行重命名字符串X中所有的LMS子串,从而形成字符串X1;
S4、检查字符串X1中的每个字符是否唯一,若是则直接排序字符串X1的各后缀来计算字符串X1的后缀数组,保存至SA1中,否则以字符串X1和SA1作为新输入参数替代字符串X和SA,分别递归调用至步骤S1和S2;
S5、根据获得的保存在SA1中的字符串X1的后缀数组,在常数工作空间内并行归纳计算字符串X的后缀数组,保存至SA中。
进一步,所述步骤S1中从右向左扫描一遍字符串X,所采用的扫描方式包括分块并行扫描、流水并行扫描以及前缀和并行扫描。
进一步,所述步骤S2中,通过数组P1和SA来对字符串X中所有的LMS子串进行常数工作空间内的并行归纳排序,包括以下步骤:
S21、初始化SA的所有元素为-1,并以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在大小为O(1)的桶数组B中;从右向左流水并行扫描字符串X,依次把扫描到的各LMS后缀填入其在SA中所属桶的当前结束位置,并将该桶的结束位置向左移动一格;
S22、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的起始位置,记录在大小为O(1)的桶数组B中,并对SA进行分块并行扫描处理:
在当前块内从左向右扫描SA,针对扫描到的每个不为-1的元素SA[i],从SA中读取X[SA[i]]的前继字符X[SA[i]-1];若该前继字符是L型,则将SA[i]-1的值以及suf(X,SA[i]-1)的后缀在SA中所属桶的当前起始位置作为排序结果记录在SA中,并将该桶的起始位置向右移动一格;
读取前一块的排序结果并记录在SA中;
读取后一块的所有前继字符并记录在SA中;
S23、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在大小为O(1)的桶数组B中,并对SA进行分块并行扫描处理:
在当前块内从右向左扫描SA,针对扫描到的每个元素SA[i],从SA中读取X[SA[i]]的前继字符X[SA[i]-1];若该前继字符是S型,则将SA[i]-1的值以及suf(X,SA[i]-1)的后缀在SA中所属桶的当前结束位置作为排序结果记录在SA中,并将该桶的结束位置向左移动一格;
读取前一块的排序结果并记录在SA中;
读取后一块的所有前继字符并记录在SA中。
进一步,所述步骤S3,根据排序结果在常数工作空间内并行重命名字符串X中所有的LMS子串,从而形成字符串X1,包括以下步骤:
S31、将SA1中已排序的LMS子串进行分块,在每个分块内从左向右依次比较相邻的两个LMS子串的大小;对于每个LMS子串,用其在SA1中所属桶的起始位置命名,第一个桶的起始位置从0开始,即得到各分块内LMS子串的局部名;
S32、利用前缀和方法统计每个分块中可使用的全局名,将各分块内LMS子串的局部名替换为全局名,从而形成字符串Z1;
S33、从右到左对字符串Z1进行分块并行扫描,针对每个被扫描到的字符Z1[i],若Z1[i]为L型,则令X1[i]=Z1[i],否则将X1[i]设为Z1[i]在SA1中所属桶的结束位置;待扫描Z1结束后,X1即为对Z1中各S型字符重命名后的结果。
进一步,步骤S5中,根据获得的保存在SA1中的字符串X1的后缀数组,在常数工作空间内并行归纳计算字符串X的后缀数组,包括以下步骤:
S51、初始化SA的所有元素为-1,以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,复用SA的空间来记录;从右向左流水并行扫描数组SA1,对每个扫描到的元素SA1[i],将P1[SA1[i]]放在后缀suf(X,P1[SA1[i]])在SA中所属桶的当前结束位置,并将该桶的结束位置向左移动一格;
S52、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,复用SA的空间进行记录,对SA进行分块并行扫描处理:
在当前块内从左向右扫描SA,针对扫描到的每个不为-1的元素SA[i],从SA中读取X[SA[i]]的前继字符X[SA[i]-1];若该前继字符是L型,则将SA[i]-1的值以及suf(X,SA[i]-1)的后缀在SA中所属桶的当前起始位置作为排序结果记录在SA中,并将该桶的起始位置向右移动一格;
读取前一块的排序结果并记录在SA中;
读取后一块的所有前继字符并记录在SA中;
S53、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,复用SA的空间进行记录,对SA进行分块并行扫描处理:
在当前块内从右向左扫描SA,针对扫描到的每个元素SA[i],从SA中读取X[SA[i]]的前继字符X[SA[i]-1];若该前继字符是S型,则将SA[i]-1的值以及suf(X,SA[i]-1)的后缀在SA中所属桶的当前结束位置作为排序结果记录在SA中,并将该桶的结束位置向左移动一格;
读取前一块的排序结果并记录在SA中;
读取后一块的所有前继字符并记录在SA中。
常数工作空间并行构造后缀数组的***,包括:并行归纳排序模块、存储单元、前置单元以及解析单元;
所述并行归纳排序模块,用于通过数组P1和SA来对输入的子串或后缀进行常数工作空间并行归纳排序,并返回结果;
所述存储单元,用于存放生成后缀数组过程中的临时数据;
所述前置单元,用于根据输入的字符串X,利用常数工作空间并行归纳排序及重命名的方法生成字符串X1,并写入存储单元;
所述解析单元,用于从存储单元读取字符串X1,以保存在SA1中的字符串X1的后缀数组,在常数工作空间内并行归纳计算字符串X的后缀数组并保存至SA中。
进一步,所述前置单元包括数组P1计算模块、LMS子串排序模块、字符串X1生成模块和字符串X1决策模块;
所述数组P1计算模块,用于读取输入的字符串X,按照LMS子串的S+L+S类型模式定义找出所有LMS字符出现的位置,从而获取字符串X中所有LMS子串的首字符指针,并记录在数组P1中;
LMS子串排序模块,用于从存储单元读取数组P1,并调用并行归纳排序模块对字符串X中所有的LMS子串进行排序,并将排序结果保存在SA1中;
字符串X1生成模块,用于从存储单元读取数组SA,并根据排序结果并行重命名字符串X中的各个LMS子串,生成字符串X1;
字符串X1决策模块,用于从存储单元读取字符串X1,判断X1的每个字符是否唯一,若是则转入解析单元,否则递归调用前置单元。
进一步,所述解析单元包括后缀数组计算模块、后缀数组生成模块和后缀数组存储单元;
所述后缀数组计算模块,用于从存储单元读取字符串X1,并直接排序字符串X1的各后缀来计算字符串X1的后缀数组,并写入存储单元;
所述后缀数组生成模块,用于从存储单元读取数组SA1,调用并行归纳排序模块来对X中所有的LMS后缀进行排序,从而得到X的后缀数组;
所述后缀数组存储单元,用于存储字符串X的后缀数组。
本发明的有益效果是:用户只需输入一个在常数字符集上定义的任意字符串X,本发明则会通过获取X中所有LMS子串的首字符指针并记录在数组P1中,以进一步利用P1和SA来对字符串X中所有的LMS子串进行常数工作空间内的并行归纳排序,得到字符串X1,并依据X1中字符的唯一性来区别SA的不同构造输入参数,最终通过X1与其后缀数组SA1的对应关系得以在常数工作空间内并行归纳计算字符串X的后缀数组到SA中。因此,本发明降低了计算机内存要求且运行速度更快,使时空复杂度达到最优,适用于大规模字符串的后缀数组构建。
附图说明
下面结合附图给出本发明较佳实施例,以详细说明本发明的实施方案。
图1是本发明的方法步骤流程图;
图2是本发明的***结构示意框图。
具体实施方式
其中,在本发明的描述中用到以下技术术语,在此说明:
工作空间:指总空间除去字符串X及其后缀数组所用空间后的剩余部分。
常数工作空间:指总空间除去在常数字符集上定义的任意字符串X及其后缀数组所用空间后的剩余部分,根据此时空复杂度的后缀数组构建算法或***所构建的后缀数组是理论上可达到的最优解。
字符集:一个字符集Σ是一个建立了全序关系的集合,即Σ中任意两个不同的元素α和β都可以比较大小,要么α<β,要么α>β。字符集Σ中的元素称为字符,其中最小的字符为‘$’。本发明所涉及的字符集大小可以是一个常数O(1)或者是一个整数O(n)。
字符串:一个长度为n的字符串X是将n个属于字符集Σ中的字符按其位置依次排列形成的数组X[0,n-1],X的结束符固定为‘$’,并且‘$’不在X中的其它位置出现。
子串:字符串X的子串X[i,j],i≤j,表示X串中从位置i到位置j的一段字符串,也就是由字符X[i],X[i+1],…,X[j]组成的字符串。
后缀:字符串X的一个后缀是指从某个位置i开始到结束符‘$’的一个子串。从第i个字符开始的后缀表示为suf(X,i),也就是suf(X,i)=X[i,n-1]。
字符和后缀类型:X中的字符分为L和S两种类型。
(1)‘$’为S类型;
(2)X[i],i∈[0,n-2]为S类型,当且仅当suf(X,i)<suf(X,i+1),即X[i]<X[i+1]或者X[i]=X[i+1]且X[i+1]为S型;
(3)X[i],i∈[0,n-2]为L类型,当且仅当suf(X,i)>suf(X,i+1),即X[i]>X[i+1]或者X[i]=X[i+1]且X[i+1]为L型。
后缀suf(X,i)是S类型当且仅当字符X[i]为S类型,后缀suf(X,i)是L类型当且仅当字符X[i]为L类型。
LMS(Leftmost S-type,最左S类型)字符和后缀:
(1)‘$’为LMS字符;
(2)X[i],i∈[1,n-1]为LMS字符,当且仅当X[i]为S型且X[i-1]为L型;
(3)后缀suf(X,i)是LMS后缀当且仅当字符X[i]为LMS字符。
LMS子串及其S+L+S类型模式:
(1)‘$’为LMS子串;
(2)X[i,j]为LMS子串,当且仅当1≤i<j<n,X[i]和X[j]同为LMS字符,且X[i]和X[j]之间不存在其他LMS字符。
因此,一个LMS子串由三部分依次组成:一个或多个S型字符,一个或多个L型字符和一个单一的S型字符,这称为LMS子串的S+L+S类型模式。
指针数组:指针数组P1记录字符串X中所有LMS子串的首字符所在的位置,即P1[i]记录字符串X中(从左到右)第i+1个LMS子串的首字符在X中的位置。
字符串大小比较:两个字符串的大小比较,是指通常所说的“字典顺序”比较,亦即对于两个字符串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。
后缀数组:后缀数组SA是一个包含n个整数的一维数组,对于i∈[0,n-1]满足suf(X,SA[i])<suf(X,SA[i+1]),也就是将X的n个后缀从小到大进行排序之后把排好序的各后缀首字符在X中的位置从左到右顺次放入SA中。
桶和桶数组:把字符串X的所有后缀按其第一个字符在数组SA中进行排序,则所有第一个字符相同的后缀都连续的排列在SA中的某一段区域,这段区域称之为对应这些后缀的一个桶。如果X中包含有i个不同的字符,则SA中会形成i个桶,而且每个桶中所包含后缀的首字符都相同。桶数组B用于记录每个桶在SA中的当前位置。
利用以上术语,给出一个构造字符串后缀数组的例子如下。字符串X=baac$,其长度n=5,suf(X,0)=baac$,suf(X,1)=aac$,suf(X,2)=ac$,suf(X,3)=c$,suf(X,4)=$。根据字符串大小比较的定义容易知道suf(X,4)<suf(X,1)<suf(X,2)<suf(X,0)<suf(X,3)。再根据后缀数组的定义,容易得出SA[0]=4,SA[1]=1,SA[2]=2,SA[3]=0,SA[4]=3,即SA=[4,1,2,0,3]。
参照图1,常数工作空间并行构造后缀数组的方法,包括以下步骤:
S1、从右向左扫描一遍输入的字符串X,按照后缀类型的定义比较当前扫描的两个相邻字符X[i]和X[i+1],从而得到每一个字符和后缀的类型;
在扫描过程中,按照LMS子串的S+L+S类型模式定义找出所有LMS字符出现的位置,从而获取字符串X中所有LMS子串的首字符指针,并记录在数组P1中;
S2、通过数组P1和SA来对字符串X中所有的LMS子串进行常数工作空间内的并行归纳排序,并将排序结果保存在SA1中;
其中,SA为数组,用于记录字符串X的后缀数组;SA1为数组,用于记录排序结果的后缀数组;
S3、根据排序结果在常数工作空间内并行重命名字符串X中所有的LMS子串,从而形成字符串X1;
S4、检查字符串X1中的每个字符是否唯一,若是则直接排序字符串X1的各后缀来计算字符串X1的后缀数组,保存至SA1中,否则以字符串X1和SA1作为新输入参数替代字符串X和SA,分别递归调用至步骤S1和S2;
S5、根据获得的保存在SA1中的字符串X1的后缀数组,在常数工作空间内并行归纳计算字符串X的后缀数组,保存至SA中。
具体地,用户只需输入一个在常数字符集上定义的任意字符串X,本发明则会通过获取X中所有LMS子串的首字符指针并记录在数组P1中,以进一步利用P1和SA来对字符串X中所有的LMS子串进行常数工作空间内的并行归纳排序,得到字符串X1,并依据X1中字符的唯一性来区别SA的不同构造输入参数,最终通过X1与其后缀数组SA1的对应关系得以在常数工作空间内并行归纳计算字符串X的后缀数组到SA中。因此,本发明降低了计算机内存要求且运行速度更快,使时空复杂度达到最优,适用于大规模字符串的后缀数组构建。
其中,所述步骤S1中从右向左扫描一遍字符串X,所采用的扫描方式包括分块并行扫描、流水并行扫描以及前缀和并行扫描,此三种扫描方式均为常见的字符串扫描方式,在此不作赘述。
其中,所述步骤S2中,通过数组P1和SA来对字符串X中所有的LMS子串进行常数工作空间内的并行归纳排序,包括以下步骤:
S21、初始化SA的所有元素为-1,并以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在大小为O(1)的桶数组B中;从右向左流水并行扫描字符串X,依次把扫描到的各LMS后缀填入其在SA中所属桶的当前结束位置,并将该桶的结束位置向左移动一格;
S22、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的起始位置,记录在大小为O(1)的桶数组B中,并对SA进行分块并行扫描处理:
在当前块内从左向右扫描SA,针对扫描到的每个不为-1的元素SA[i],从SA中读取X[SA[i]]的前继字符X[SA[i]-1];若该前继字符是L型,则将SA[i]-1的值以及suf(X,SA[i]-1)的后缀在SA中所属桶的当前起始位置作为排序结果记录在SA中,并将该桶的起始位置向右移动一格;
读取前一块的排序结果并记录在SA中;
读取后一块的所有前继字符并记录在SA中;
S23、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在大小为O(1)的桶数组B中,并对SA进行分块并行扫描处理:
在当前块内从右向左扫描SA,针对扫描到的每个元素SA[i],从SA中读取X[SA[i]]的前继字符X[SA[i]-1];若该前继字符是S型,则将SA[i]-1的值以及suf(X,SA[i]-1)的后缀在SA中所属桶的当前结束位置作为排序结果记录在SA中,并将该桶的结束位置向左移动一格;
读取前一块的排序结果并记录在SA中;
读取后一块的所有前继字符并记录在SA中。
进一步,所述步骤S3,根据排序结果在常数工作空间内并行重命名字符串X中所有的LMS子串,从而形成字符串X1,包括以下步骤:
S31、将SA1中已排序的LMS子串进行分块,在每个分块内从左向右依次比较相邻的两个LMS子串的大小;对于每个子串,用其在SA1中所属桶的起始位置命名,第一个桶的起始位置从0开始,即得到各分块内LMS子串的局部名;
S32、利用前缀和方法统计每个分块中可使用的全局名,将各分块内LMS子串的局部名替换为全局名,从而形成字符串Z1;
S33、从右到左对字符串Z1进行分块并行扫描,针对每个被扫描到的字符Z1[i],若Z1[i]为L型,则令X1[i]=Z1[i],否则将X1[i]设为Z1[i]在SA1中所属桶的结束位置;待扫描Z1结束后,X1即为对Z1中各S型字符重命名后的结果。
其中,步骤S5中,根据获得的保存在SA1中的字符串X1的后缀数组,在常数工作空间内并行归纳计算字符串X的后缀数组中,包括以下步骤:
S51、初始化SA的所有元素为-1,以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,复用SA的空间来记录;从右向左流水并行扫描数组SA1,对每个扫描到的元素SA1[i],将P1[SA1[i]]放在后缀suf(X,P1[SA1[i]])在SA中所属桶的当前结束位置,并将该桶的结束位置向左移动一格;
S52、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,复用SA的空间进行记录,对SA进行分块并行扫描处理:
在当前块内从左向右扫描SA,针对扫描到的每个不为-1的元素SA[i],从SA中读取X[SA[i]]的前继字符X[SA[i]-1];若该前继字符是L型,则将SA[i]-1的值以及suf(X,SA[i]-1)的后缀在SA中所属桶的当前起始位置作为排序结果记录在SA中,并将该桶的起始位置向右移动一格;
读取前一块的排序结果并记录在SA中;
读取后一块的所有前继字符并记录在SA中;
S53、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,复用SA的空间进行记录,对SA进行分块并行扫描处理:
在当前块内从右向左扫描SA,针对扫描到的每个元素SA[i],从SA中读取X[SA[i]]的前继字符X[SA[i]-1];若该前继字符是S型,则将SA[i]-1的值以及suf(X,SA[i]-1)的后缀在SA中所属桶的当前结束位置作为排序结果记录在SA中,并将该桶的结束位置向左移动一格;
读取前一块的排序结果并记录在SA中;
读取后一块的所有前继字符并记录在SA中。
参照图2,常数工作空间并行构造后缀数组的***,包括:并行归纳排序模块8、存储单元1、前置单元2以及解析单元3;
所述并行归纳排序模块8,用于通过数组P1和SA来对输入的子串或后缀进行常数工作空间并行归纳排序,并返回结果;
所述存储单元1,用于存放生成后缀数组过程中的临时数据,例如数组P1、SA1和字符串X1等;
所述前置单元2,用于根据输入的字符串X,利用常数工作空间并行归纳排序及重命名的方法生成字符串X1,并写入存储单元1;
所述解析单元3,用于从存储单元1读取字符串X1,以保存在SA1中的字符串X1的后缀数组,在常数工作空间内并行归纳计算字符串X的后缀数组并保存至SA中。
具体地,并行归纳排序模块8是前置单元2和解析单元3均可调用的模块,存储单元1的设置保证了构建过程中的数据不丢失,并且有利于前置单元2和解析单元3的读取或调用。
其中,所述前置单元2包括数组P1计算模块4、LMS子串排序模块5、字符串X1生成模块6和字符串X1决策模块7;
所述数组P1计算模块4,用于读取输入的字符串X,按照LMS子串的S+L+S类型模式定义找出所有LMS字符出现的位置,从而获取字符串X中所有LMS子串的首字符指针,并记录在数组P1中;
LMS子串排序模块5,用于从存储单元1读取数组P1,并调用并行归纳排序模块8对字符串X中所有的LMS子串进行排序,并将排序结果保存在SA1中;
字符串X1生成模块6,用于从存储单元1读取数组SA,并根据排序结果并行重命名字符串X中的各个LMS子串,生成字符串X1;
字符串X1决策模块7,用于从存储单元1读取字符串X1,判断X1的每个字符是否唯一,若是则转入解析单元3,否则递归调用前置单元2。
其中,所述解析单元3包括后缀数组计算模块9、后缀数组生成模块10和后缀数组存储单元11;
所述后缀数组计算模块9,用于从存储单元1读取字符串X1,并直接排序X1的各后缀来计算X1的后缀数组并写入存储单元;
所述后缀数组生成模块10,用于从存储单元1读取数组SA1,并调用并行归纳排序模块8来对X中所有的LMS后缀进行排序,从而得到X的后缀数组;
所述后缀数组存储单元11,用于存储字符串X的后缀数组。
以上内容对本发明的较佳实施例和基本原理作了详细论述,但本发明并不局限于上述实施方式,熟悉本领域的技术人员应该了解在不违背本发明精神的前提下还会有各种等同变形和替换,这些等同变形和替换都落入要求保护的本发明范围内。

Claims (8)

1.常数工作空间并行构造后缀数组的方法,其特征在于,包括以下步骤:
S1、从右向左扫描一遍输入的字符串X,按照后缀类型的定义比较当前扫描的两个相邻字符X[i]和X[i+1],从而得到每一个字符和后缀的类型;
在扫描过程中,按照LMS子串的S+L+S类型模式定义找出所有LMS字符出现的位置,从而获取字符串X中所有LMS子串的首字符指针,并记录在数组P1中;
S2、通过数组P1和SA来对字符串X中所有的LMS子串进行常数工作空间内的并行归纳排序,并将排序结果保存在SA1中;
其中,SA为用于记录字符串X的后缀数组;SA1为用于记录排序结果的后缀数组;
S3、根据排序结果在常数工作空间内并行重命名字符串X中所有的LMS子串,从而形成字符串X1;
S4、检查字符串X1中的每个字符是否唯一,若是则直接排序字符串X1的各后缀来计算字符串X1的后缀数组,保存至SA1中,否则以字符串X1和SA1作为新输入参数替代字符串X和SA,分别递归调用至步骤S1和S2;
S5、根据获得的保存在SA1中的字符串X1的后缀数组,在常数工作空间内并行归纳计算字符串X的后缀数组,保存至SA中。
2.根据权利要求1所述的常数工作空间并行构造后缀数组的方法,其特征在于,所述步骤S1中从右向左扫描一遍字符串X,所采用的扫描方式包括分块并行扫描、流水并行扫描以及前缀和并行扫描。
3.根据权利要求1所述的常数工作空间并行构造后缀数组的方法,其特征在于,所述步骤S2中,通过数组P1和SA来对字符串X中所有的LMS子串进行常数工作空间内的并行归纳排序,包括以下步骤:
S21、初始化SA的所有元素为-1,并以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在大小为O(1)的桶数组B中;从右向左流水并行扫描字符串X,依次把扫描到的各LMS后缀填入其在SA中所属桶的当前结束位置,并将该桶的结束位置向左移动一格;
S22、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的起始位置,记录在大小为O(1)的桶数组B中,并对SA进行分块并行扫描处理:
在当前块内从左向右扫描SA,针对扫描到的每个不为-1的元素SA[i],从SA中读取X[SA[i]]的前继字符X[SA[i]-1];若该前继字符是L型,则将SA[i]-1的值以及suf(X,SA[i]-1)的后缀在SA中所属桶的当前起始位置作为排序结果记录在SA中,并将该桶的起始位置向右移动一格;
读取前一块的排序结果并记录在SA中;
读取后一块的所有前继字符并记录在SA中;
S23、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在大小为O(1)的桶数组B中,并对SA进行分块并行扫描处理:
在当前块内从右向左扫描SA,针对扫描到的每个元素SA[i],从SA中读取X[SA[i]]的前继字符X[SA[i]-1];若该前继字符是S型,则将SA[i]-1的值以及suf(X,SA[i]-1)的后缀在SA中所属桶的当前结束位置作为排序结果记录在SA中,并将该桶的结束位置向左移动一格;
读取前一块的排序结果并记录在SA中;
读取后一块的所有前继字符并记录在SA中。
4.根据权利要求1所述的常数工作空间并行构造后缀数组的方法,其特征在于,所述步骤S3,根据排序结果在常数工作空间内并行重命名字符串X中所有的LMS子串,从而形成字符串X1,包括以下步骤:S31、将SA1中已排序的LMS子串进行分块,在每个分块内从左向右依次比较相邻的两个LMS子串的大小;对于每个LMS子串,用其在SA1中所属桶的起始位置命名,第一个桶的起始位置从0开始,即得到各分块内LMS子串的局部名;
S32、利用前缀和方法统计每个分块中可使用的全局名,将各分块内LMS子串的局部名替换为全局名,从而形成字符串Z1;
S33、从右到左对字符串Z1进行分块并行扫描,针对每个被扫描到的字符Z1[i],若Z1[i]为L型,则令X1[i]=Z1[i],否则将X1[i]设为Z1[i]在SA1中所属桶的结束位置;待扫描Z1结束后,X1即为对Z1中各S型字符重命名后的结果。
5.根据权利要求1所述的常数工作空间并行构造后缀数组的方法,其特征在于,步骤S5中,根据获得的保存在SA1中的字符串X1的后缀数组,在常数工作空间内并行归纳计算字符串X的后缀数组,包括以下步骤:
S51、初始化SA的所有元素为-1,以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,复用SA的空间来记录;从右向左流水并行扫描数组SA1,对每个扫描到的元素SA1[i],将P1[SA1[i]]放在后缀suf(X,P1[SA1[i]])在SA中所属桶的当前结束位置,并将该桶的结束位置向左移动一格;
S52、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,复用SA的空间进行记录,对SA进行分块并行扫描处理:
在当前块内从左向右扫描SA,针对扫描到的每个不为-1的元素SA[i],从SA中读取X[SA[i]]的前继字符X[SA[i]-1];若该前继字符是L型,则将SA[i]-1的值以及suf(X,SA[i]-1)的后缀在SA中所属桶的当前起始位置作为排序结果记录在SA中,并将该桶的起始位置向右移动一格;
读取前一块的排序结果并记录在SA中;
读取后一块的所有前继字符并记录在SA中;
S53、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,复用SA的空间进行记录,对SA进行分块并行扫描处理:
在当前块内从右向左扫描SA,针对扫描到的每个元素SA[i],从SA中读取X[SA[i]]的前继字符X[SA[i]-1];若该前继字符是S型,则将SA[i]-1的值以及suf(X,SA[i]-1)的后缀在SA中所属桶的当前结束位置作为排序结果记录在SA中,并将该桶的结束位置向左移动一格;
读取前一块的排序结果并记录在SA中;
读取后一块的所有前继字符并记录在SA中。
6.基于权利要求1-5任一所述的常数工作空间并行构造后缀数组的方法的***,其特征在于,包括:并行归纳排序模块(8)、存储单元(1)、前置单元(2)以及解析单元(3);
所述并行归纳排序模块(8),用于通过数组P1和SA来对输入的子串或后缀进行常数工作空间并行归纳排序,并返回结果;
所述存储单元(1),用于存放生成后缀数组过程中的临时数据;
所述前置单元(2),用于根据输入的字符串X,利用常数工作空间并行归纳排序及重命名的方法生成字符串X1,并写入存储单元(1);
所述解析单元(3),用于从存储单元(1)读取字符串X1,并以保存在SA1中的字符串X1的后缀数组,在常数工作空间内并行归纳计算字符串X的后缀数组并保存至SA中。
7.根据权利要求6所述的常数工作空间并行构造后缀数组的***,其特征在于,所述前置单元(2)包括数组P1计算模块(4)、LMS子串排序模块(5)、字符串X1生成模块(6)和字符串X1决策模块(7);
所述数组P1计算模块(4),用于读取输入的字符串X,按照LMS子串的S+L+S类型模式定义找出所有LMS字符出现的位置,从而获取字符串X中所有LMS子串的首字符指针,并记录在数组P1中;
LMS子串排序模块(5),用于从存储单元(1)读取数组P1,并调用并行归纳排序模块(8)对字符串X中所有的LMS子串进行排序,并将排序结果保存在SA1中;
字符串X1生成模块(6),用于从存储单元(1)读取数组SA,并根据排序结果并行重命名字符串X中的各个LMS子串,从而生成字符串X1;
字符串X1决策模块(7),用于从存储单元(1)读取字符串X1,判断X1的每个字符是否唯一,若是则转入解析单元(3),否则递归调用前置单元(2)。
8.根据权利要求7所述的常数工作空间并行构造后缀数组的***,其特征在于,所述解析单元(3)包括后缀数组计算模块(9)、后缀数组生成模块(10)和后缀数组存储单元(11);
所述后缀数组计算模块(9),用于从存储单元(1)读取字符串X1,并直接排序字符串X1的各后缀来计算字符串X1的后缀数组,并写入存储单元(1);
所述后缀数组生成模块(10),用于从存储单元(1)读取数组SA1,并调用并行归纳排序模块(8)来对字符串X中所有的LMS后缀进行排序,从而得到字符串X的后缀数组;
所述后缀数组存储单元(11),用于存储字符串X的后缀数组。
CN201810344030.2A 2018-04-17 2018-04-17 常数工作空间并行构造后缀数组的方法及*** Pending CN108763170A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810344030.2A CN108763170A (zh) 2018-04-17 2018-04-17 常数工作空间并行构造后缀数组的方法及***

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810344030.2A CN108763170A (zh) 2018-04-17 2018-04-17 常数工作空间并行构造后缀数组的方法及***

Publications (1)

Publication Number Publication Date
CN108763170A true CN108763170A (zh) 2018-11-06

Family

ID=64010834

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810344030.2A Pending CN108763170A (zh) 2018-04-17 2018-04-17 常数工作空间并行构造后缀数组的方法及***

Country Status (1)

Country Link
CN (1) CN108763170A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109614510A (zh) * 2018-11-23 2019-04-12 腾讯科技(深圳)有限公司 一种图像检索方法、装置、图形处理器和存储介质
CN110852046A (zh) * 2019-10-18 2020-02-28 中山大学 一种文本后缀索引的分块归纳排序方法及***

Citations (5)

* 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 农革 后缀数组构造方法
CN102521213A (zh) * 2011-12-01 2012-06-27 农革 线性时间后缀数组构造方法
CN107015951A (zh) * 2017-03-24 2017-08-04 广东顺德中山大学卡内基梅隆大学国际联合研究院 一种后缀数组的正确性验证方法及***
CN107015952A (zh) * 2017-03-24 2017-08-04 广东顺德中山大学卡内基梅隆大学国际联合研究院 一种后缀数组和最长公共前缀的正确性验证方法及***

Patent Citations (5)

* 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 农革 后缀数组构造方法
CN102521213A (zh) * 2011-12-01 2012-06-27 农革 线性时间后缀数组构造方法
CN107015951A (zh) * 2017-03-24 2017-08-04 广东顺德中山大学卡内基梅隆大学国际联合研究院 一种后缀数组的正确性验证方法及***
CN107015952A (zh) * 2017-03-24 2017-08-04 广东顺德中山大学卡内基梅隆大学国际联合研究院 一种后缀数组和最长公共前缀的正确性验证方法及***

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109614510A (zh) * 2018-11-23 2019-04-12 腾讯科技(深圳)有限公司 一种图像检索方法、装置、图形处理器和存储介质
CN109614510B (zh) * 2018-11-23 2021-05-07 腾讯科技(深圳)有限公司 一种图像检索方法、装置、图形处理器和存储介质
CN110852046A (zh) * 2019-10-18 2020-02-28 中山大学 一种文本后缀索引的分块归纳排序方法及***
CN110852046B (zh) * 2019-10-18 2021-11-05 中山大学 一种文本后缀索引的分块归纳排序方法及***

Similar Documents

Publication Publication Date Title
CN108804204A (zh) 多线程并行构造后缀数组的方法及***
US7080091B2 (en) Inverted index system and method for numeric attributes
CN101359325B (zh) 一种快速内容分析的多关键词匹配方法
CN110134714B (zh) 适用于大数据迭代计算的分布式计算框架缓存索引方法
CN105335481B (zh) 一种大规模字符串文本的后缀索引构造方法及装置
CN102640089A (zh) 电子设备的文本输入***及文本输入方法
CN102081673A (zh) 后缀数组构造方法
JPH09134369A (ja) ラティスをキーとした検索を行う辞書検索装置および方法
US5367677A (en) System for iterated generation from an array of records of a posting file with row segments based on column entry value ranges
Tavakoli Modeling genome data using bidirectional LSTM
CN102073740A (zh) 基于基数排序的字符串后缀数组构造方法
CN110083683B (zh) 基于随机游走的实体语义标注方法
CN107316062A (zh) 一种改进的面向领域的命名实体消歧方法
CN108763170A (zh) 常数工作空间并行构造后缀数组的方法及***
CN106484815B (zh) 一种基于海量数据类sql检索场景的自动识别优化方法
US5734592A (en) Method for determining a ranked set of associations
CN111753514B (zh) 一种专利申请文本的自动生成方法和装置
CN116383422B (zh) 一种基于锚点的无监督跨模态哈希检索方法
CN111125408A (zh) 基于特征提取的搜索方法、装置、计算机设备和存储介质
CN108628907A (zh) 一种用于基于Aho-Corasick的Trie树多关键词匹配的方法
CN101251845A (zh) 利用改进的Wu-Manber算法进行多模式串匹配的方法
JP2003256265A (ja) 検索メモリ、メモリ検索用コントローラ、メモリ検索方法
US6625592B1 (en) System and method for hash scanning of shared memory interfaces
CN102521213A (zh) 线性时间后缀数组构造方法
JP2007034878A (ja) 情報処理方法、情報処理装置および情報処理プログラム

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication

Application publication date: 20181106

RJ01 Rejection of invention patent application after publication