CN108804204A - 多线程并行构造后缀数组的方法及*** - Google Patents
多线程并行构造后缀数组的方法及*** Download PDFInfo
- Publication number
- CN108804204A CN108804204A CN201810343122.9A CN201810343122A CN108804204A CN 108804204 A CN108804204 A CN 108804204A CN 201810343122 A CN201810343122 A CN 201810343122A CN 108804204 A CN108804204 A CN 108804204A
- Authority
- CN
- China
- Prior art keywords
- suffix
- character string
- array
- character
- lms
- 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
- 238000000034 method Methods 0.000 title claims abstract description 49
- XLYOFNOQVPJJNP-UHFFFAOYSA-N water Substances O XLYOFNOQVPJJNP-UHFFFAOYSA-N 0.000 claims description 9
- 238000010276 construction Methods 0.000 claims description 8
- 238000012163 sequencing technique Methods 0.000 claims description 5
- 235000013399 edible fruits Nutrition 0.000 claims 1
- 238000004321 preservation Methods 0.000 abstract 1
- 108090000623 proteins and genes Proteins 0.000 description 2
- 230000001174 ascending effect Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000013144 data compression Methods 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 239000002360 explosive Substances 0.000 description 1
- 238000009958 sewing Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了多线程并行构造后缀数组的方法及***,包括:扫描字符串X,利用L/S类型识别方法计算字符和后缀的类型,记录在数组t中;扫描数组t,找出LMS字符出现的位置,获取LMS子串的首字符指针并用数组P1来记录LMS子串的指针;通过P1、B和SA来对X中所有的LMS子串进行并行归纳排序,保存在SA1中;根据排序结果多线程并行重命名X中的各LMS子串,形成X1;检查X1中的每个字符是否唯一,若是则直接排序X1的各后缀来计算X1的后缀数组并保存至SA1中,最后根据保存在SA1中的X1的后缀数组,计算X的后缀数组并保存至SA中。本发明的运行速度快,可匹配于多核计算机的内存,适用于大规模字符串的后缀数组构建。
Description
技术领域
本发明涉及字符串后缀数组构造领域,尤其是多线程并行构造后缀数组的方法及***。
背景技术
后缀数组(Suffix Array,SA)是计算机科学中的一种重要数据结构,具有结构紧凑且空间占用小的特点,在全文索引、基因匹配和数据压缩等诸多领域具有广泛应用。任意给定一个长度为n的输入字符串文本X[0,n-1],简称为字符串X,从X中的任意位置i开始到结束位置n-1的所有字符组成一个字符子串X[i,n-1],该子串称为字符串X的一个后缀(Suffix)。显然,长度为n的字符串X包含n个后缀,对这n个后缀按字典顺序升序保存在一个整型数组中,则该数组称为字符串X的后缀数组SA。
近年来,通用计算机的内存空间不断增大,使得在内存模型上快速处理大规模的文本和基因数据变成了可能。然而,随着数据规模的爆发式增长,现有的串行方法及***在处理大规模字符串数据时,无法满足快速处理的需求,尤其是在多核计算机的内存模型下,更是难以达到操作者的目标期望。
发明内容
为了解决上述问题,本发明的目的是提供多线程并行构造后缀数组的方法及***,其运行速度更快,可匹配于多核计算机的内存,适用于大规模字符串的后缀数组构建。
为了弥补现有技术的不足,本发明采用的技术方案是:
多线程并行构造后缀数组的方法,包括以下步骤:
S1、从右向左扫描一遍输入的字符串X,利用L/S类型识别方法来计算出每一个字符和后缀的类型,记录在数组t中;
S2、从左向右扫描一遍数组t,通过LMS识别方法来找出所有LMS字符出现的位置,从而获取所有LMS子串的首字符指针,用数组P1来记录每一个LMS子串的指针;
S3、通过数组P1、B和SA来对X中所有的LMS子串进行多线程并行归纳排序,并将排序结果保存在SA1中;其中,SA为用于记录字符串X的后缀数组;SA1为用于记录排序结果的后缀数组;B为桶数组;
S4、根据排序结果进行多线程并行重命名字符串X中的各个LMS子串,从而形成字符串X1;
S5、检查字符串X1中的每个字符是否唯一,若是则直接排序字符串X1的各后缀来计算字符串X1的后缀数组并保存至SA1中,否则以字符串X1和SA1作为新输入参数替代字符串X和SA,分别递归调用至步骤S1和S2;
S6、根据获得的保存在SA1中的字符串X1的后缀数组,多线程并行归纳计算字符串X的后缀数组并保存至SA中。
进一步,所述步骤S1中从右向左扫描一遍字符串X,所采用的扫描方式包括分块并行扫描、流水并行扫描以及前缀和并行扫描。
进一步,所述步骤S3中,通过数组P1、B和SA来对X中所有的LMS子串进行多线程并行归纳排序,包括以下步骤:
S31、初始化SA的所有元素为-1,并以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组B中;从左向右流水并行扫描字符串X,依次把扫描到的各LMS后缀填入其在SA中所属桶的当前结束位置,并将该桶的结束位置向左移动一格;
S32、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的起始位置,记录在数组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中;
S33、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组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中。
进一步,所述步骤S4,根据排序结果进行多线程并行重命名字符串X中的各个LMS子串,从而形成字符串X1,包括以下步骤:
S41、将SA1中已排序的LMS子串进行分块,在每个分块内从左向右依次比较相邻的两个LMS子串的大小,对于被比较的LMS子串从0开始编号命名,若两个LMS子串相等,则编号一样,否则更大者的编号等于更小者的编号加1;
S42、利用前缀和方法统计每个分块中可使用的全局名,将各分块内LMS子串的局部名替换为全局名;
S43、将X中的LMS子串用步骤S42中获取的全局名来代替,从而形成字符串X1。
进一步,步骤S6中,根据获得的保存在SA1中的字符串X1的后缀数组,多线程并行归纳计算字符串X的后缀数组并保存至SA中,包括以下步骤:
S61、初始化SA的所有元素为-1,以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组B中;从右向左流水并行扫描数组SA1,对每个扫描到的元素SA1[i],将P1[SA1[i]]放在后缀suf(X,P1[SA1[i]])在SA中所属桶的当前结束位置,并将该桶的结束位置向左移动一格;
S62、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组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中。
S63、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组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中。
多线程并行构造后缀数组的方法的***,包括:多线程并行排序模块、存储单元、前置单元以及解析单元;
所述多线程并行排序模块,用于通过数组P1、B和SA来对输入的子串或后缀进行多线程并行归纳排序,并返回结果;
所述存储单元,用于存放生成后缀数组SA过程中的临时数据;
所述前置单元,用于根据输入的字符串X,利用多线程并行归纳排序及重命名的方法生成字符串X1,并写入存储单元;
所述解析单元,用于从存储单元读取字符串X1,以保存在SA1中的字符串X1的后缀数组,多线程并行归纳计算字符串X的后缀数组并保存到SA中。
进一步,所述前置单元包括L/S类型识别模块、数组t计算模块、LMS识别模块、数组P1计算模块、LMS子串排序模块、字符串X1生成模块和字符串X1决策模块;
所述L/S类型识别模块,用于识别输入的字符和后缀是L类型或S类型;
所述数组t计算模块,用于读取输入的字符串X,并调用L/S类型识别模块来计算X中每一个字符和后缀的类型,将结果存放在数组t中;
所述LMS识别模块,用于识别输入的字符/子串/后缀是否为LMS字符/子串/后缀;
所述数组P1计算模块,用于从存储单元读取数组t,调用LMS识别模块来计算所有LMS子串的首字符指针,并记录在数组P1中;
LMS子串排序模块,用于从存储单元读取数组P1,并调用多线程并行排序模块对字符串X中所有的LMS子串进行排序,并将排序结果保存在SA1中;
字符串X1生成模块,用于从存储单元读取数组SA,并根据排序结果并行重命名字符串X中的各个LMS子串,生成字符串X1;
字符串X1决策模块,用于从存储单元读取字符串X1,判断X1的每个字符是否唯一,若是则转入解析单元,否则递归调用前置单元。
进一步,所述解析单元包括后缀数组计算模块、后缀数组生成模块和后缀数组存储模块;
所述后缀数组计算模块,用于从存储单元读取字符串X1,并直接排序字符串X1的各后缀来计算字符串X1的后缀数组并写入存储单元;
所述后缀数组生成模块,用于从存储单元读取数组SA1,调用多线程并行排序模块来对X中所有的LMS后缀进行排序,从而得到字符串X的后缀数组;
所述后缀数组存储模块,用于存储字符串X的后缀数组。
本发明的有益效果是:通过扫描字符串X获取其LMS子串的指针,进一步对这些LMS子串进行多线程并行排序,相比于串行排序,由于同时对若干子串进行扫描处理,因此其速度更快;并且由于是多线程处理的,对应计算机的负荷也分为多条支线,所以刚好适配于多核计算机***,从而可以处理较大的字符串,比如规模在1GB以上的任意给定字符串。因此,本发明的运行速度更快,可匹配于多核计算机的内存,适用于大规模字符串的后缀数组构建。
附图说明
下面结合附图给出本发明较佳实施例,以详细说明本发明的实施方案。
图1是本发明的方法步骤流程图;
图2是本发明的***结构示意框图。
具体实施方式
其中,在本发明的描述中可能用到以下技术术语,在此说明:
字符集:一个字符集Σ是一个建立了全序关系的集合,即Σ中任意两个不同的元素α和β都可以比较大小,要么α<β,要么α>β。字符集Σ中的元素称为字符,其中最小的字符为‘$’。本发明所涉及的字符集大小可以是一个常数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中的当前位置。
参照图1,多线程并行构造后缀数组的方法,包括以下步骤:
S1、从右向左扫描一遍输入的字符串X,利用L/S类型识别方法来计算出每一个字符和后缀的类型,记录在数组t中;
S2、从左向右扫描一遍数组t,通过LMS识别方法来找出所有LMS字符出现的位置,从而获取所有LMS子串的首字符指针,用数组P1来记录每一个LMS子串的指针;
S3、通过数组P1、B和SA来对X中所有的LMS子串进行多线程并行归纳排序,并将排序结果保存在SA1中;其中,SA为用于记录字符串X的后缀数组;SA1为用于记录排序结果的后缀数组;B为桶数组;
S4、根据排序结果进行多线程并行重命名字符串X中的各个LMS子串,从而形成字符串X1;
S5、检查字符串X1中的每个字符是否唯一,若是则直接排序字符串X1的各后缀来计算字符串X1的后缀数组并保存至SA1中,否则以字符串X1和SA1作为新输入参数替代字符串X和SA,分别递归调用至步骤S1和S2;
S6、根据获得的保存在SA1中的字符串X1的后缀数组,多线程并行归纳计算字符串X的后缀数组并保存至SA中。
具体地,步骤S1中的L/S类型识别方法用于识别输入的字符和后缀是L还是S类型,包括:假定字符串的最后一个字符为‘$’,若该字符在整个字符串所包含的字符当中最小并且唯一,则为S类型;然后从字符串文本倒数第二个字符开始往前扫描,若当前字符比前一字符小,则该字符为S类型,或当前字符与前一字符相等且前一字符为S类型,则该字符也为S类型;除上述情况之外,字符被识别为L类型。相应地,若某字符为L型或S型字符,则该字符所对应的后缀分别称为L型或S型后缀。
步骤S2中的LMS识别方法用于识别输入的字符/子串/后缀是否为LMS字符/子串/后缀,包括LMS字符识别方法、LMS子串识别方法和LMS后缀识别方法;
其中,LMS字符识别方法包括:若当前字符为S型字符,且字符串中与当前字符相邻的左边第一个字符为L型字符,则该字符为LMS字符;
所述LMS子串识别方法为:若子串的首字符和末字符均为LMS字符,且首字符与末字符之间不存在任何其它LMS字符,则为LMS子串;
所述LMS后缀的识别方法为:若某字符为LMS字符,则该字符所对应的后缀称为LMS后缀。
本发明通过扫描字符串X获取其LMS子串的指针,进一步对这些LMS子串进行多线程并行排序,相比于串行排序,由于同时对若干子串进行扫描处理,因此其速度更快;并且由于是多线程处理的,对应计算机的负荷也分为多条支线,所以刚好适配于多核计算机***,从而可以处理较大的字符串,比如规模在1GB以上的任意给定字符串。因此,本发明的运行速度更快,可匹配于多核计算机的内存,适用于大规模字符串的后缀数组构建。
其中,所述步骤S1中从右向左扫描一遍字符串X,所采用的扫描方式包括分块并行扫描、流水并行扫描以及前缀和并行扫描。
其中,所述步骤S3中,通过数组P1、B和SA来对X中所有的LMS子串进行多线程并行归纳排序,包括以下步骤:
S31、初始化SA的所有元素为-1,并以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组B中;从左向右流水并行扫描字符串X,依次把扫描到的各LMS后缀填入其在SA中所属桶的当前结束位置,并将该桶的结束位置向左移动一格;
S32、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的起始位置,记录在数组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中;
S33、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组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中。
其中,根据排序结果进行多线程并行重命名字符串X中的各个LMS子串,从而形成字符串X1,包括以下步骤:
S41、将SA1中已排序的LMS子串进行分块,在每个分块内从左向右依次比较相邻的两个LMS子串的大小,对于被比较的LMS子串从0开始编号命名,若两个LMS子串相等,则编号一样,否则更大者的编号等于更小者的编号加1;
S42、利用前缀和方法统计每个分块中可使用的全局名,将各分块内LMS子串的局部名替换为全局名;
S43、将X中的LMS子串用步骤S42中获取的全局名来代替,从而形成字符串X1。
其中,根据获得的保存在SA1中的字符串X1的后缀数组,多线程并行归纳计算字符串X的后缀数组并保存至SA中,包括以下步骤:
S61、初始化SA的所有元素为-1,以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组B中;从右向左流水并行扫描数组SA1,对每个扫描到的元素SA1[i],将P1[SA1[i]]放在后缀suf(X,P1[SA1[i]])在SA中所属桶的当前结束位置,并将该桶的结束位置向左移动一格;
S62、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组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中。
S63、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组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中。
参照图2,多线程并行构造后缀数组的***,包括:多线程并行排序模块11、存储单元1、前置单元2以及解析单元3;
所述多线程并行排序模块11,用于通过数组P1、B和SA来对输入的子串或后缀进行多线程并行归纳排序,并返回结果;
所述存储单元1,用于存放生成后缀数组SA过程中的临时数据;
所述前置单元2,用于根据输入的字符串X,利用多线程并行归纳排序及重命名的方法生成字符串X1,并写入存储单元1;
所述解析单元3,用于从存储单元1读取字符串X1,以保存在SA1中的字符串X1的后缀数组,多线程并行归纳计算字符串X的后缀数组并保存到SA中。
具体地,存储单元1的设置方便于保存构建过程中的各种中间数据,比如数组P1、SA1、字符串X等,同时方便被前置单元2和解析单元3所调用;多线程并行模块主要用于LMS子串的并行排序及后缀数组SA的并行归纳。
其中,参照图2,所述前置单元2包括L/S类型识别模块4、数组t计算模块5、LMS识别模块6、数组P1计算模块7、LMS子串排序模块8、字符串X1生成模块9和字符串X1决策模块10;
所述L/S类型识别模块4,用于识别输入的字符和后缀是L类型或S类型;
所述数组t计算模块5,用于读取输入的字符串X,并调用L/S类型识别模块4来计算X中每一个字符和后缀的类型,将结果存放在数组t中;
所述LMS识别模块6,用于识别输入的字符/子串/后缀是否为LMS字符/子串/后缀;
所述数组P1计算模块7,用于从存储单元1读取数组t,调用LMS识别模块6来计算所有LMS子串的首字符指针,并记录在数组P1中;
LMS子串排序模块8,用于从存储单元1读取数组P1,并调用多线程并行排序模块11对字符串X中所有的LMS子串进行排序,并将排序结果保存在SA1中;
字符串X1生成模块9,用于从存储单元1读取数组SA,并根据排序结果并行重命名字符串X中的各个LMS子串,生成字符串X1;
字符串X1决策模块10,用于从存储单元1读取字符串X1,判断X1的每个字符是否唯一,若是则转入解析单元3,否则递归调用前置单元2。
其中,参照图2,所述解析单元3包括后缀数组计算模块12、后缀数组生成模块13和后缀数组存储模块14;
所述后缀数组计算模块12,用于从存储单元1读取字符串X1,并直接排序X1的各后缀来计算X1的后缀数组并写入存储单元1;
所述后缀数组生成模块13,用于从存储单元1读取数组SA1,调用多线程并行排序模块11来对X中所有的LMS后缀进行排序,从而得到X的后缀数组;
所述后缀数组存储模块14,用于存储字符串X的后缀数组。
以上内容对本发明的较佳实施例和基本原理作了详细论述,但本发明并不局限于上述实施方式,熟悉本领域的技术人员应该了解在不违背本发明精神的前提下还会有各种等同变形和替换,这些等同变形和替换都落入要求保护的本发明范围内。
Claims (8)
1.多线程并行构造后缀数组的方法,其特征在于,包括以下步骤:
S1、从右向左扫描一遍输入的字符串X,利用L/S类型识别方法来计算出每一个字符和后缀的类型,记录在数组t中;
S2、从左向右扫描一遍数组t,通过LMS识别方法来找出所有LMS字符出现的位置,从而获取所有LMS子串的首字符指针,用数组P1来记录每一个LMS子串的指针;
S3、通过数组P1、B和SA来对X中所有的LMS子串进行多线程并行归纳排序,并将排序结果保存在SA1中;其中,SA为用于记录字符串X的后缀数组;SA1为用于记录排序结果的后缀数组;B为桶数组;
S4、根据排序结果进行多线程并行重命名字符串X中的各个LMS子串,从而形成字符串X1;
S5、检查字符串X1中的每个字符是否唯一,若是则直接排序字符串X1的各后缀来计算字符串X1的后缀数组并保存至SA1中,否则以字符串X1和SA1作为新输入参数替代字符串X和SA,分别递归调用至步骤S1和S2;
S6、根据获得的保存在SA1中的字符串X1的后缀数组,多线程并行归纳计算字符串X的后缀数组并保存至SA中。
2.根据权利要求1所述的多线程并行构造后缀数组的方法,其特征在于,所述步骤S1中从右向左扫描一遍字符串X,所采用的扫描方式包括分块并行扫描、流水并行扫描以及前缀和并行扫描。
3.根据权利要求1所述的多线程并行构造后缀数组的方法,其特征在于,所述步骤S3中,通过数组P1、B和SA来对X中所有的LMS子串进行多线程并行归纳排序,包括以下步骤:
S31、初始化SA的所有元素为-1,并以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组B中;从左向右流水并行扫描字符串X,依次把扫描到的各LMS后缀填入其在SA中所属桶的当前结束位置,并将该桶的结束位置向左移动一格;
S32、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的起始位置,记录在数组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中;
S33、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组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所述的多线程并行构造后缀数组的方法,其特征在于,所述步骤S4,根据排序结果进行多线程并行重命名字符串X中的各个LMS子串,从而形成字符串X1,包括以下步骤:
S41、将SA1中已排序的LMS子串进行分块,在每个分块内从左向右依次比较相邻的两个LMS子串的大小,对于被比较的LMS子串从0开始编号命名,若两个LMS子串相等,则编号一样,否则更大者的编号等于更小者的编号加1;
S42、利用前缀和方法统计每个分块中可使用的全局名,将各分块内LMS子串的局部名替换为全局名;
S43、将X中的LMS子串用步骤S42中获取的全局名来代替,从而形成字符串X1。
5.根据权利要求1所述的多线程并行构造后缀数组的方法,其特征在于,步骤S6中,根据获得的保存在SA1中的字符串X1的后缀数组,多线程并行归纳计算字符串X的后缀数组并保存至SA中,包括以下步骤:
S61、初始化SA的所有元素为-1,以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组B中;从右向左流水并行扫描数组SA1,对每个扫描到的元素SA1[i],将P1[SA1[i]]放在后缀suf(X,P1[SA1[i]])在SA中所属桶的当前结束位置,并将该桶的结束位置向左移动一格;
S62、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组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中。
S63、以前缀和并行方式扫描出字符串X中所有后缀在SA中所属各桶的结束位置,记录在数组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中。
6.基于权利要求1-5任一所述的多线程并行构造后缀数组的方法的***,其特征在于,包括:多线程并行排序模块(11)、存储单元(1)、前置单元(2)以及解析单元(3);
所述多线程并行排序模块(11),用于通过数组P1、B和SA来对输入的子串或后缀进行多线程并行归纳排序,并返回结果;
所述存储单元(1),用于存放生成后缀数组SA过程中的临时数据;
所述前置单元(2),用于根据输入的字符串X,利用多线程并行归纳排序及重命名的方法生成字符串X1,并写入存储单元(1);
所述解析单元(3),用于从存储单元(1)读取字符串X1,以保存在SA1中的字符串X1的后缀数组,多线程并行归纳计算字符串X的后缀数组并保存到SA中。
7.根据权利要求6所述的多线程并行构造后缀数组的***,其特征在于,所述前置单元(2)包括L/S类型识别模块(4)、数组t计算模块(5)、LMS识别模块(6)、数组P1计算模块(7)、LMS子串排序模块(8)、字符串X1生成模块(9)和字符串X1决策模块(10);
所述L/S类型识别模块(4),用于识别输入的字符和后缀是L类型或S类型;
所述数组t计算模块(5),用于读取输入的字符串X,并调用L/S类型识别模块(4)来计算X中每一个字符和后缀的类型,将结果存放在数组t中;
所述LMS识别模块(6),用于识别输入的字符/子串/后缀是否为LMS字符/子串/后缀;
所述数组P1计算模块(7),用于从存储单元(1)读取数组t,调用LMS识别模块(6)来计算所有LMS子串的首字符指针,并记录在数组P1中;
LMS子串排序模块(8),用于从存储单元(1)读取数组P1,并调用多线程并行排序模块(11)对字符串X中所有的LMS子串进行排序,并将排序结果保存在SA1中;
字符串X1生成模块(9),用于从存储单元(1)读取数组SA,并根据排序结果并行重命名字符串X中的各个LMS子串,生成字符串X1;
字符串X1决策模块(10),用于从存储单元(1)读取字符串X1,判断X1的每个字符是否唯一,若是则转入解析单元(3),否则递归调用前置单元(2)。
8.根据权利要求7所述的多线程并行构造后缀数组的***,其特征在于,所述解析单元(3)包括后缀数组计算模块(12)、后缀数组生成模块(13)和后缀数组存储模块(14);
所述后缀数组计算模块(12),用于从存储单元(1)读取字符串X1,并直接排序字符串X1的各后缀来计算字符串X1的后缀数组并写入存储单元(1);
所述后缀数组生成模块(13),用于从存储单元(1)读取数组SA1,调用多线程并行排序模块(11)来对X中所有的LMS后缀进行排序,从而得到字符串X的后缀数组;
所述后缀数组存储模块(14),用于存储字符串X的后缀数组。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810343122.9A CN108804204A (zh) | 2018-04-17 | 2018-04-17 | 多线程并行构造后缀数组的方法及*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810343122.9A CN108804204A (zh) | 2018-04-17 | 2018-04-17 | 多线程并行构造后缀数组的方法及*** |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108804204A true CN108804204A (zh) | 2018-11-13 |
Family
ID=64094285
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810343122.9A Pending CN108804204A (zh) | 2018-04-17 | 2018-04-17 | 多线程并行构造后缀数组的方法及*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108804204A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110837584A (zh) * | 2019-10-18 | 2020-02-25 | 中山大学 | 一种分块并行构造后缀数组的方法及*** |
CN110852046A (zh) * | 2019-10-18 | 2020-02-28 | 中山大学 | 一种文本后缀索引的分块归纳排序方法及*** |
CN112765938A (zh) * | 2021-01-13 | 2021-05-07 | 中山大学 | 构造后缀数组的方法、终端设备及计算机可读存储介质 |
CN113407328A (zh) * | 2021-07-14 | 2021-09-17 | 厦门科灿信息技术有限公司 | 多线程数据处理方法、装置、终端及采集*** |
CN115982311A (zh) * | 2023-03-21 | 2023-04-18 | 广东海洋大学 | 一种链表的生成方法、装置、终端设备及存储介质 |
Citations (6)
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 | 农革 | 线性时间后缀数组构造方法 |
CN103810228A (zh) * | 2012-11-01 | 2014-05-21 | 辉达公司 | 用于经采样的后缀数组的并行重建的***、方法和产品 |
CN105264522A (zh) * | 2014-03-28 | 2016-01-20 | 华为技术有限公司 | 后缀数组的构造方法及装置 |
CN107015951A (zh) * | 2017-03-24 | 2017-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组的正确性验证方法及*** |
-
2018
- 2018-04-17 CN CN201810343122.9A patent/CN108804204A/zh active Pending
Patent Citations (6)
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 | 农革 | 线性时间后缀数组构造方法 |
CN103810228A (zh) * | 2012-11-01 | 2014-05-21 | 辉达公司 | 用于经采样的后缀数组的并行重建的***、方法和产品 |
CN105264522A (zh) * | 2014-03-28 | 2016-01-20 | 华为技术有限公司 | 后缀数组的构造方法及装置 |
CN107015951A (zh) * | 2017-03-24 | 2017-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组的正确性验证方法及*** |
Non-Patent Citations (1)
Title |
---|
孙伟东: "cuda计算技术在生物序列数据处理中的应用研究", 《中国博士学位论文全文数据库基础科学辑》 * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110837584A (zh) * | 2019-10-18 | 2020-02-25 | 中山大学 | 一种分块并行构造后缀数组的方法及*** |
CN110852046A (zh) * | 2019-10-18 | 2020-02-28 | 中山大学 | 一种文本后缀索引的分块归纳排序方法及*** |
CN110852046B (zh) * | 2019-10-18 | 2021-11-05 | 中山大学 | 一种文本后缀索引的分块归纳排序方法及*** |
CN112765938A (zh) * | 2021-01-13 | 2021-05-07 | 中山大学 | 构造后缀数组的方法、终端设备及计算机可读存储介质 |
CN112765938B (zh) * | 2021-01-13 | 2024-02-09 | 中山大学 | 构造后缀数组的方法、终端设备及计算机可读存储介质 |
CN113407328A (zh) * | 2021-07-14 | 2021-09-17 | 厦门科灿信息技术有限公司 | 多线程数据处理方法、装置、终端及采集*** |
CN113407328B (zh) * | 2021-07-14 | 2023-11-07 | 厦门科灿信息技术有限公司 | 多线程数据处理方法、装置、终端及采集*** |
CN115982311A (zh) * | 2023-03-21 | 2023-04-18 | 广东海洋大学 | 一种链表的生成方法、装置、终端设备及存储介质 |
CN115982311B (zh) * | 2023-03-21 | 2023-06-20 | 广东海洋大学 | 一种链表的生成方法、装置、终端设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108804204A (zh) | 多线程并行构造后缀数组的方法及*** | |
CN1030114C (zh) | 汉语发音符号/汉字变换装置及方法 | |
CN100356392C (zh) | 一种字符识别的后处理方法 | |
Kaukoranta et al. | A fast exact GLA based on code vector activity detection | |
JPH06187497A (ja) | 文字認識方法 | |
CN105335481B (zh) | 一种大规模字符串文本的后缀索引构造方法及装置 | |
CN111860981B (zh) | 一种基于lstm深度学习的企业国民行业类别预测方法及*** | |
Tavakoli | Modeling genome data using bidirectional LSTM | |
CN102081673A (zh) | 后缀数组构造方法 | |
JPH07319924A (ja) | 手書き電子文書のインデックス付けおよび探索方法 | |
Burges et al. | Shortest path segmentation: A method for training a neural network to recognize character strings | |
US5734592A (en) | Method for determining a ranked set of associations | |
CN111125408A (zh) | 基于特征提取的搜索方法、装置、计算机设备和存储介质 | |
CN108763170A (zh) | 常数工作空间并行构造后缀数组的方法及*** | |
US20100057809A1 (en) | Information storing/retrieving method and device for state transition table, and program | |
CN106709273B (zh) | 微藻蛋白质特征序列标签匹配的快速检测方法及*** | |
CN106570058A (zh) | 一种搜索方法和搜索引擎 | |
WO2003058489A1 (en) | Discriminative feature selection for data sequences | |
CN115906763A (zh) | 一种招标文件解析表格抽取方法 | |
CN110019829B (zh) | 数据属性确定方法、装置 | |
CN109828785A (zh) | 一种采用gpu加速的近似代码克隆检测方法 | |
CN116108217A (zh) | 一种基于深度哈希编码和多任务预测的逃费车辆相似图片检索方法 | |
JP3370787B2 (ja) | 文字配列検索方法 | |
CN110221986B (zh) | 闪存逻辑物理映射表的排序方法、***以及其闪存 | |
CN110059228B (zh) | 一种dna数据集植入模体搜索方法及其装置与存储介质 |
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: 20181113 |
|
RJ01 | Rejection of invention patent application after publication |