CN110837584B - 一种分块并行构造后缀数组的方法及*** - Google Patents
一种分块并行构造后缀数组的方法及*** Download PDFInfo
- Publication number
- CN110837584B CN110837584B CN201910992637.6A CN201910992637A CN110837584B CN 110837584 B CN110837584 B CN 110837584B CN 201910992637 A CN201910992637 A CN 201910992637A CN 110837584 B CN110837584 B CN 110837584B
- Authority
- CN
- China
- Prior art keywords
- lms
- character string
- block
- suffix
- data block
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/903—Querying
- G06F16/90335—Query processing
- G06F16/90348—Query processing by searching ordered data, e.g. alpha-numerically ordered data
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请实施例适用于数据处理技术领域,提供了一种分块并行构造后缀数组的方法及***,所述方法包括:针对任一字符串,将用于存储字符串的后缀数组的存储单元划分为多个数据块;获取各个数据块的定位信息,根据定位信息将多个LMS子串分别存入各个数据块;并行地归纳排序各个数据块中的各个LMS子串;重命名归纳排序后的各个LMS子串,获得目标字符串;若目标字符串中各个目标字符均唯一,则计算目标字符串的后缀数组,根据目标字符串的后缀数组将字符串的LMS后缀存入各个数据块;根据各个数据块中的LMS后缀,并行地归纳排序得到字符串的后缀数组。采用本实施例提供的方法,可以在多核计算机内、外存上高效准确地构造后缀数组。
Description
技术领域
本申请属于数据处理技术领域,特别是涉及一种分块并行构造后缀数组的方法及***。
背景技术
近年来,随着互联网的发展,海量应用每时每刻都在产生文本、信号、日志、代码等数据,因其数量巨大,如何有效地管理这些数据成为了一个重要的课题。在数据管理这一大课题中,精确高效的数据检索又是其中一个重要的环节。
搭载了Lucene(一种开放源代码的全文检索引擎工具包)的Elasticsearch是目前最知名的、开源的分布式搜索引擎,但Lucene底层使用的分词倒排索引将其适用空间限制在了仅能检索可分词的数据,而对于检索日志、代码这种难以分词的数据以及信号、二进制等不可分词的数据而言,则需要真正意义上的全文索引。
后缀树是一个经典的全文索引,但它在实际应用中需要占用过多的空间资源。而作为后缀树的空间紧凑型替代,后缀数组(SuffixArray,SA)可以成为检索海量多源异构数据所需的全文索引。因后缀数组在生物信息学领域的广泛应用,如何高效准确地构造后缀数组一直被研究者们关注和探索。因此,为了满足它在多种场景下的应用需求,研究者们提出了诸多构造后缀数组的方法并开发了若干与之相对应的程序和***。
但是,在通过构造后缀数组实现分布式全文检索***时,数据流在传入***的过程中需要根据预设的大小被拆分成若干文件,然后由***根据内外存可用的空间大小选择不同计算模型下的程序,如:内存串行、内存并行、外存串行等程序来构造或合并它们的后缀索引。具体来说,一般2GiB以下的文件采用内存版本的程序,其数据存储和读写都在RAM下操作;而在处理合并索引的步骤时,若待合并索引的数据文件大小超过了2GiB,则采用外存版本的程序来进行合并构造,此时大部分数据都存储在硬盘上,并通过串行的方式读写,仅少量需随机读写的数据会读取至RAM内处理。虽然这些程序各自的效率都比较可观,但它们均由不同的研究者设计实现,方法细节也各不相同,难以将其集成到全文检索***中并根据实际需要进行更新。
发明内容
有鉴于此,本申请实施例提供了一种分块并行构造后缀数组的方法及***,以解决现有技术中无法使用相同的方法在多核计算机内、外存上高效准确地构造后缀数组的问题。
本申请实施例的第一方面提供了一种分块并行构造后缀数组的方法,包括:
针对任一字符串,将用于存储所述字符串的后缀数组的存储单元划分为多个数据块,所述字符串包括多个LMS字符,各个LMS字符分别对应一个以所述LMS字符为起始的LMS子串和LMS后缀;
获取各个数据块的定位信息,根据所述定位信息将所述多个LMS子串分别存入所述各个数据块;
并行地归纳排序所述各个数据块中的各个LMS子串;
重命名归纳排序后的所述各个LMS子串,获得目标字符串,所述目标字符串包括多个目标字符,任一目标字符与所述字符串的一个LMS子串对应;
若所述目标字符串中至少存在一个目标字符不唯一,则以所述目标字符串作为输入的字符串,返回执行所述将用于存储所述字符串的后缀数组的存储单元划分为多个数据块的步骤;
若所述目标字符串中各个目标字符均唯一,则计算所述目标字符串的后缀数组,根据所述目标字符串的后缀数组将所述字符串的LMS后缀存入所述各个数据块;根据所述各个数据块中的LMS后缀,并行地归纳排序得到所述字符串的后缀数组。
本申请实施例的第二方面提供了一种分块并行构造后缀数组的***,包括:
数据块划分模块,用于针对任一字符串,将用于存储所述字符串的后缀数组的存储单元划分为多个数据块,所述字符串包括多个LMS字符,各个LMS字符分别对应一个以所述LMS字符为起始的LMS子串和LMS后缀;
LMS子串存储模块,用于获取各个数据块的定位信息,根据所述定位信息将所述多个LMS子串分别存入所述各个数据块;
LMS子串排序模块,用于并行地归纳排序所述各个数据块中的各个LMS子串;
目标字符串生成模块,用于重命名归纳排序后的所述各个LMS子串,获得目标字符串,所述目标字符串包括多个目标字符,任一目标字符与所述字符串的一个LMS子串对应;
调用模块,用于若所述目标字符串中至少存在一个目标字符不唯一,则以所述目标字符串作为输入的字符串,调用所述数据块划分模块,否则调用LMS后缀存储模块;
LMS后缀存储模块,用于计算所述目标字符串的后缀数组,根据所述目标字符串的后缀数组将所述字符串的LMS后缀存入所述各个数据块;
后缀数组排序模块,用于根据所述各个数据块中的LMS后缀,并行地归纳排序得到所述字符串的后缀数组。
本申请实施例的第三方面提供了终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上述第一方面所述分块并行构造后缀数组的方法的步骤。
本申请实施例的第四方面提供了计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如上述第一方面所述分块并行构造后缀数组的方法的步骤。
与现有技术相比,本申请实施例包括以下优点:
本申请实施例,针对任一字符串,将用于存储该字符串的后缀数组的存储单元划分为多个数据块,然后可以获取各个数据块的定位信息,并根据定位信息将多个LMS子串分别存入各个数据块,再并行地对各个数据块中的各个LMS子串进行归纳排序,以及重命名归纳排序后的各个LMS子串,获得目标字符串后,判断目标字符串中各个字符是否唯一,如果存在任一字符不唯一,则需要将目标字符串作为新输入的字符串重新执行前述步骤,如果全部字符均唯一,则可以直接计算目标字符串的后缀数组,并将目标字符串中各字符对应的原字符串的LMS后缀存入各个数据块,然后再进行归纳排序得到原字符串的后缀数组。本实施例在将存储后缀数组的单元分块的基础上,通过将待排序的前继子串或后缀先放入其所属的数据块,可以在块内按其首字符稳定排序至最终的位置;同时,通过预先读取前继字符等信息避免归纳排序执行过程中在O(n)范围的字符串中随机访问等方式来统一多核计算机内、外存上构造后缀数组的方法,能够解决现有技术中无法使用相同的方法在多核计算机内、外存上高效准确地构造后缀数组的问题,提高了后缀数组的构造效率,并能够将适用于内存中的后缀数组构造方法方便快捷地扩展至计算机外存。在实际应用中,采用本实施例提供的方法可以便于开发多核计算机上内、外存通用的后缀数组构造***。即,可以根据本实施例提供的方法步骤先开发***内的内存版程序,再在它的基础上添加若干I/O模块将其扩展为外存版程序,这是软件工程开发中一项突出的优势。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍。显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请一个实施例的一种分块并行构造后缀数组的方法的步骤流程示意图;
图2是本申请一个实施例的多核计算机的结构示意图;
图3是本申请一个实施例的分块并行构造后缀数组的数据处理流程示意图;
图4是本申请一个实施例的一种分块并行构造后缀数组的***的示意图;
图5是本申请一个实施例的一种终端设备的示意图。
具体实施方式
以下描述中,为了说明而不是为了限定,提出了诸如特定***结构、技术之类的具体细节,以便透彻理解本申请实施例。然而,本领域技术人员应当清楚,在没有这些具体细节的其他实施例中也可以实现本申请。在其他情况中,省略对众所周知的***、装置、电路以及方法的详细说明,以免不必要的细节妨碍本申请的描述。
下面通过具体实施例来说明本申请的技术方案。
首先,将本申请可能使用到的技术术语,统一在此说明。
字符串:一个长度为n的字符串X是将n个属于其字符集Σ的字符按一定规则依次排列形成的字符数组X[0…n-1],其中,假设X[n-1]是仅在X中出现一次的、字典序最小的字符$。
子串:X[i…j],0≤i≤j≤n-1,即X[i]到X[j]之间(包括X[i]和X[j])所有字符组成的字符串。
后缀:即X[i…n–1],0≤i≤n–1,一般记作suf(X,i)。
后缀数组(SA):是将X的所有后缀按照字典序从小到大的顺序排列,并将它们在X中的起始位置按排列后的次序保存在一个整数数组里获得的数据结构。
字符和后缀的类型:X中的字符X[i]可分为L型和S型两类,其中,若满足(1)i=n–1;(2)X[i]<X[i+1];(3)X[i]=X[i+1]且X[i+1]为S型字符,则X[i]为S型字符,否则为L型字符。进一步地,若X[i]为S型字符且X[i-1]为L型字符,则X[i]同时也是LMS字符。X的后缀suf(X,i)的类型与它的首字符X[i]相同。
L/S/LMS子串:对于X的子串X[i…j](i≠j),若X[i]和X[j]均为L/S/LMS字符,且它们之间没有其它L/S/LMS字符,则X[i…j]为L/S/LMS子串,除此以外,X[n-1]也为LMS子串。
前继字符、子串和后缀:对于字符串X的其中一个字符X[i](i>0)而言,其前继字符为X[i-1],类似地,以这个字符X[i]起始的子串或后缀的前继子串或前继后缀起始于X[i-1]。
子串或后缀所属的块:对于已按预设划分方式分块的SA,在X的所有后缀都已排序的情况下,suf(X,i)所在的块即为其所属的块,同理,子串X[i…j]所属的块也为这一块。
桶:起始于同一个字符的多个后缀会在SA中占据一块连续的区域,这块区域称为该字符的桶。
边界字符:在SA已分块的基础上,一个字符桶可能跨越多个块,则这一字符被称为这些块的边界字符。
参照图1,示出了本申请一个实施例的一种分块并行构造后缀数组的方法的步骤流程示意图,具体可以包括如下步骤:
S101、针对任一字符串,将用于存储所述字符串的后缀数组的存储单元划分为多个数据块,所述字符串包括多个LMS字符,各个LMS字符分别对应一个以所述LMS字符为起始的LMS子串和LMS后缀;
需要说明的是,本方法可以适用于多核计算机。即,通过实施本方法可以在多核计算机的内存中高效准确地构造出后缀数组,且本方法也易于扩展至计算机外存。
在本实施例中,对于任一字符串,可以首先将多核计算机内存中的某一存储单元划分为多个数据块,通过这些分块后的存储单元来存储后续计算得到的后缀数组。
本实施例可以采用均匀分块或按桶分块等不同的处理方式来对上述存储单元进行分块,本实施例对此不作具体限定。
针对任一字符串,可以首先为该字符串和该字符串的后缀数组分配所需的存储单元,然后根据预设的划分方式,将用于存储该字符串的后缀数组的存储单元划分为多个数据块。上述预设的划分方式可以由用户根据实际需要确定,本实施例对此不作限定。
以均匀分块为例,若预设的划分方式为均匀分块且划分数值为m,则可以将该字符串的后缀数组的存储单元划分为同样大小的若干块,得到块,其中,符号表示计算n与m之间的比值,并向上取整。在均匀分块的情况下,除最后一块以外,每个数据块的块长是固定的。
当然,若按桶分块,得到的各个数据块的块长则一般是不固定的。
S102、获取各个数据块的定位信息,根据所述定位信息将所述多个LMS子串分别存入所述各个数据块;
在本实施例中,在划分得到多个数据块后,可以收集各个数据块的定位信息,如各数据块的边界字符信息、初始化边界字符计数器等等。这些定位信息可以用于后续定位子串或后缀所属的块。
在具体实现中,可以首先统计字符串中各个字符出现的次数,然后根据各个字符出现的次数,采用前缀和等算法计算各个数据块的边界字符信息。得到的边界字符信息等定位信息便可以用于归纳排序时计算子串或后缀所属块的块号。需要说明的是,边界字符信息属于均匀分块后各个数据块所特有的定位信息。若按照其他分块方式,如按桶分块,其定位信息中则不包括边界字符信息。
在将多个LMS子串分别存入各个数据块时,可以首先对各个数据块进行初始化处理,使各个数据块的块尾位置指向该数据块的末尾,进而从右向左分块流水并行扫描字符串,若当前扫描到的字符为LMS字符,则可以以该LMS字符为起始字符确定出目标LMS子串,并根据各块的边界字符信息、边界字符计数器等数据块的定位信息将目标LMS子串存入其所属的目标数据块的块尾位置,再更新该块尾位置。
例如,可以首先将各个数据块中每个元素初始化为空(EMPTY),并初始化各数据块的块尾位置指向该块的末尾。
需要说明的是,块尾位置通常情况下是移动的,每存储一个LMS子串至某个数据块,该数据块的块尾位置就将向左移动一位;而数据块的末尾则是固定值。即,本实施例为了区分这两个变量和常量,使用了块尾位置和块的末尾这两个表述近似的名词。
在初始化完成后,可以从右向左分块流水并行扫描字符串。在扫描过程中比较当前字符和前一个被扫描到的字符,根据字符类型的定义,若当前被扫描到的字符为LMS字符,则可以将以当前字符为起始字符的LMS子串存储至它所属的数据块的尾部,并将块尾位置向左移动一位。
S103、并行地归纳排序所述各个数据块中的各个LMS子串;
在将各个LMS子串存储至各个数据块中之后,可以并行地对各个块中的LMS子串进行归纳排序。
可以先从左向右、再从右向左扫描各个数据块,在扫描过程中确定当前数据块,以及当前数据块的多个相邻数据块。
在从左向右扫描各个数据块进行归纳排序之前,可以首先对各个数据块进行初始化,使得各个数据块的块头位置指向块的开头。
需要说明的是,与前一步骤中块尾位置和块的末尾类似,本步骤中的块头位置也是移动的,而块的开头则是一固定值。即,块头/块尾位置是个变量,而块的开头/末尾是个常量。
类似地,随后在从右向左扫描各个数据块进行归纳排序之前,可以首先对各个数据块进行初始化,使得各个数据块的块尾位置指向块的末尾。
初始化后,归纳排序的具体操作为并行地对当前数据块中的各个子串和多个相邻数据块中的各个子串执行不同的数据处理任务,上述各个子串包括但不限于各个LMS子串,所执行的各个数据处理任务可以包括前继字符读取任务、块内子串稳定排序任务、块内子串归纳排序任务和排序结果写回任务。当当前数据块中的各个子串和多个相邻数据块中的各个子串均完成全部上述数据处理任务时,停止执行数据处理任务。
在具体实现中,需要先从左至右再从右至左依次处理每一个数据块,并在从左至右时令左边第一个数据块为块0,而在从右至左时令右边第一个数据块为块0,然后多线程并行地完成以下四个任务:对当前块i执行前继字符读取任务;对块i-1执行块内子串稳定排序任务;对块i-2执行块内子串归纳排序任务;对块i-3执行排序结果写回任务。
当然,上述描述仅为一种示例,所阐述的四个任务仅包含其基本点,在实际处理过程中因工程实现的优劣问题可能会有多种实现方式,本实施例对此不作限定。
S104、重命名归纳排序后的所述各个LMS子串,获得目标字符串,所述目标字符串包括多个目标字符,任一目标字符与所述字符串的一个LMS子串对应;
在本实施例中,可以多线程并行处理各个数据块中的LMS子串的大小比较任务,然后再根据大小比较结果重命名所有LMS子串,得到新的目标字符串。
在具体实现中,可以首先确定任意相邻两个LMS子串中各个字符的位置顺序,然后逐一比较相邻两个LMS子串中具有相同位置顺序的两个字符的字典序大小,再根据大小比较结果重命名所有LMS子串。
例如,若相邻两个LMS子串的各相同位置顺序的字符的字典序大小均相同,则将后一LMS子串的名称重命名为与前一LMS子串的名称相同;若相邻两个LMS子串的各相同位置顺序的字符的字典序大小存在不相同的情况,则采用预设命名算法重命名后一LMS子串的名称,得到目标字符串,上述预设命名算法可以包括串行命名、并行命名再用前缀和算法整合各块的局部名字中的至少一种。
所得到的目标字符串中的任一目标字符分别代表原字符串的一个LMS子串。
S105、若所述目标字符串中至少存在一个目标字符不唯一,则以所述目标字符串作为输入的字符串,返回执行所述将用于存储所述字符串的后缀数组的存储单元划分为多个数据块的步骤;
在重命名归纳排序后的各个LMS子串,获得目标字符串后,可以判断新获得的目标字符串中所有的字符是否都唯一。如果存在任一字符不唯一,则可以将当前获得的目标字符串作为输入数据重新执行步骤S101。
需要说明的是,该目标字符串的后缀数组应在S101分配新的存储单元,或也可能重用当前后缀数组的存储单元,本实施例对此不作限定。
S106、若所述目标字符串中各个目标字符均唯一,则计算所述目标字符串的后缀数组,根据所述目标字符串的后缀数组将所述字符串的LMS后缀存入所述各个数据块;
若目标字符串中所有的字符都唯一,则可以直接使用基数排序计算目标字符串的后缀数组。
由于在目标字符均唯一的情况下,表示字符串的各个LMS子串已有序,此时,与各个LMS子串对应的各个LMS后缀也一定有序。因此,在计算得到目标字符串的后缀数组后,可以根据计算得到的后缀数组,将原字符串的各个已有序的LMS后缀按序进行存储。
S107、根据所述各个数据块中的LMS后缀,并行地归纳排序得到所述字符串的后缀数组。
在将计算得到的原字符串的已有序的各LMS后缀存入数据块后,可以并行地对所有后缀进行归纳排序。
与归纳排序LMS子串类似,可以首先从左向右、再从右向左扫描所述各个数据块,在扫描过程中确定当前数据块,以及当前数据块的多个相邻数据块,并类似地在从左向右扫描各个数据块进行归纳排序之前和从右向左扫描各个数据块进行归纳排序之前,分别初始化各个数据块的块头位置指向块的开头以及初始化各个数据块的块尾位置指向块的末尾。
初始化后,归纳排序的具体操作为并行地对当前数据块中的各个后缀和多个相邻数据块中的各个后缀执行数据处理任务,上述各个后缀包括但不限于各个LMS后缀,上述数据处理任务也可以包括前继字符读取任务、块内后缀稳定排序任务、块内后缀归纳排序任务和排序结果写回任务。当当前数据块中的各个后缀和多个相邻数据块中的各个后缀均完成全部上述数据处理任务时,便可以停止。
在本申请实施例中,针对任一字符串,将用于存储该字符串的后缀数组的存储单元划分为多个数据块,然后可以获取各个数据块的定位信息,并根据定位信息将多个LMS子串分别存入各个数据块,再并行地对各个数据块中的各个LMS子串进行归纳排序,以及重命名归纳排序后的各个LMS子串,获得目标字符串后,判断目标字符串中各个字符是否唯一,如果存在任一字符不唯一,则需要将目标字符串作为新输入的字符串重新执行前述步骤,如果全部字符均唯一,则可以直接计算目标字符串的后缀数组,并将目标字符串中各字符对应的原字符串的LMS后缀存入各个数据块,然后再进行归纳排序得到原字符串的后缀数组。本实施例在将存储后缀数组的单元分块的基础上,通过将待排序的前继子串或后缀先放入其所属的数据块,可以在块内按其首字符稳定排序至最终的位置;同时,通过预先读取前继字符等信息避免归纳排序执行过程中在O(n)范围的字符串中随机访问等方式来统一多核计算机内、外存上构造后缀数组的方法,能够解决现有技术中无法使用相同的方法在多核计算机内、外存上高效准确地构造后缀数组的问题,提高了后缀数组的构造效率,并能够将适用于内存中的后缀数组构造方法方便快捷地扩展至计算机外存。在实际应用中,采用本实施例提供的方法可以便于开发多核计算机上内、外存通用的后缀数组构造***。即,可以根据本实施例提供的方法步骤先开发***内的内存版程序,再在它的基础上添加若干I/O模块将其扩展为外存版程序,这是软件工程开发中一项突出的优势。
为了便于理解,下面以一个完整的示例,对本申请的分块并行构造后缀数组的方法作一介绍。
如图2是本申请一个实施例的多核计算机的结构示意图。在图2所示的多核计算机中,可以通过执行如图3所示的分块并行构造后缀数组的数据处理流程,从而在多核计算机的内存中高效准确地构造出后缀数组,并能够方便地扩展至多核计算机外存中。
如图2所示,多核计算机可以包括并行归纳排序模块、前置单元、解析单元和存储单元等。下面对各模块及单元的作用作简单介绍。
并行归纳排序模块:对于给定的X和SA,在SA分块的基础上,易于扩展至外存地并行归纳排序X的子串或者后缀,并返回结果;
前置单元:根据X的信息,在存储单元中开辟SA所需的存储空间并将其分块,再收集块定位信息,然后易于扩展至外存地并行归纳排序字符串X的LMS子串并易于扩展至外存地重命名排序后的LMS子串获得X1,根据X1中的字符是否唯一决定以X1为输入再次进入前置单元还是进入解析单元。在上述过程中,需要读写存储单元;
解析单元:包括SA1计算模块、LMS后缀放置模块、SA推导模块等。可以从存储单元获取X1,直接计算X1的后缀数组SA1,并根据SA1易于扩展至外存地并行归纳排序获得X的后缀数组SA。在上述过程中,需要读写存储单元;
存储单元:用于存放构造SA过程中需要读写的各类数据,包括输入***的字符串X和***输出的后缀数组SA。
下面结合图3所示,对分块并行构造后缀数组的方法作一详细介绍,整个过程可以包括如下步骤:
S300、开始。
在开始时,表示在一台具备多核处理器的计算机上,输入一个字符串X,开始计算其SA。在整个流程中,计算机内存空间等价于图2***中的存储单元,无论是输入X、输出SA,还是流程中所需的各类临时数据,都在存储单元中供***内各单元、模块处理任务时读写。考虑到存储单元中各数据生命周期不尽相同,在***具体实现过程中可能存在多种工程处理方式,如重用空间等,此处不作具体说明和限制。
S301、将SA分块并收集块定位信息。
此步骤中,SA即为后续用于存储字符串的后缀数组的存储单元。初始时,在存储单元中开辟SA所需的存储空间,此时SA为空。可以使用特定方法对SA进行分块。在将SA分块后,收集后续定位子串或后缀在SA内其所属块需要的信息。上述特定方法可以是均匀分块、按桶分块等等。其中,该方法易于扩展至外存的关键是:在将SA分块后,可以将大小上限为O(n)的桶计数器压缩至大小为O(m)的块计数器,其中m为块数,在外存方法下大小为O(m)量级的块计数器足够读至内存处理。
S302、扫描X一次,将其所有LMS子串放入SA内它们所属的数据块中。
即,使用特定方法从右向左扫描字符串X,在扫描过程中根据字符类型的定义计算每一个字符的类型,同时将X的所有LMS子串放入SA内它们所属的数据块中。此步骤中,特定方法可以是串行扫描、分块并行扫描、分块流水并行扫描等等。其中,该方法易于扩展至外存的关键是:LMS子串被放入它们在SA中所属的块而非具体的桶。
(1)将SA中的每个元素都初始化为EMPTY,初始化SA各块的块尾位置指向块的末尾。
(2)从右向左分块流水并行扫描字符串X,在扫描过程中比较当前字符X[i]和前一个被扫描到的字符X[i+1]的字典序大小。根据字符类型定义,若X[i]为LMS字符,则将以X[i]为起始的LMS子串放入SA内它所属的块的尾部,并将块尾位置向左移动一位。
S303、并行归纳排序X的所有LMS子串,存入SA。
此步骤中,在完成当前块i的前继字符读取任务的同时,利用多线程并行地完成,块i-1的块内子串稳定排序任务、块i-2的块内子串归纳排序任务及块i-3的排序结果写回任务。其中,该方法易于扩展至外存的关键是:首先,前继字符读取任务避免了在其他任务中外存下的随机访问;第二,前继子串均先写回SA中其所属的块,再由块内子串稳定排序任务放至块内的最终位置。
(1)初始化SA各块的块头位置指向块的开头。从左至右依次处理SA的每一个分块,令左边第一块为块0,多线程并行地完成以下四个任务:①当前块i的前继字符读取任务,在块i内,并行从左至右扫描SA,若SA[j]不为EMPTY,则读取X[SA[j]]及其前继字符X[SA[j]-1],若X[SA[j]-1]为L型,则将前述读取的信息存储在读缓存中;②块i-1的块内子串稳定排序任务,初始化一个块内桶数组,根据首字符基数排序块内现有的子串,将它们放入块内对应的字符桶内;③块i-2的块内子串归纳排序任务,归纳排序块内已有子串的L型前继子串,前继子串的信息从读缓存中获取,如果前继子串为L型且其所属的块为块i-2,则将SA[j]-1直接写入块i-2的对应桶内,如果前继子串为L型且其所属的块为后续其他块,则将SA[j]-1顺序存入前继子串所属的块对应的写缓存中;④块i-3的排序结果写回任务,读取写缓存,将由块i-3的块内子串归纳排序任务所推导得到的、属于后续所有块的L型前继子串按块并行顺序写回它们所属块的块头位置,每写入一个,块头位置右移一位。
(2)初始化SA各块的块尾位置指向块的末尾。从右至左依次处理SA的每一个分块,令右边第一块为块0,多线程并行地完成以下四个任务:①当前块i的前继字符读取任务,在块i内,并行从右至左扫描SA,若SA[j]不为EMPTY则读取X[SA[j]]及其前继字符X[SA[j]-1],若X[SA[j]-1]为S型,则将前述读取的信息存储在读缓存中;②块i-1的块内子串稳定排序任务,初始化一个块内桶数组,根据首字符基数排序块内现有的子串,将它们放入块内对应的字符桶内;③块i-2的块内子串归纳排序任务,归纳排序块内已有子串的S型前继子串,前继子串的信息从读缓存中获取,如果前继子串为S型且其所属的块为块i-2,则将SA[j]-1直接写入块i-2的对应桶内,如果前继子串为S型且其所属的块为后续其他块,则将SA[j]-1顺序存入前继子串所属的块对应的写缓存中;④块i-3的排序结果写回任务,读取写缓存,将由块i-3的块内子串归纳排序任务所推导得到的、属于后续所有块的S型前继子串按块并行顺序写回它们所属块的块尾位置,每写入一个,块尾位置左移一位。
需要说明的是,此步骤中,所阐述的四个任务仅包含其基本点,在实际***模块中因工程实现的优劣问题可能会有多种实现方式。
S304、并行重命名SA中的X的所有LMS子串,获得新的字符串X1。
此步骤中,可以先将SA中分散的LMS子串压缩到SA左侧,然后多线程并行处理包括LMS子串的这部分SA各块内的X的LMS子串大小比较任务,即逐一比较相邻两个LMS子串中各对应位置字符的字典序大小,再根据大小比较的结果使用特定方法1命名所有LMS子串得到中间字符串S1。具体操作为:若相邻两LMS子串相同,则两者名字相同,否则使用前缀和方法获得后者的新名字。命名之后,每个LMS子串都成为一个字符,获得新字符串S1。最后使用特定方法2从右向左扫描S1并重命名其中的S型字符,获得X1。其中,特定方法1可以是串行命名、并行命名再用前缀和方法整合各块的局部名字等等;特定方法2可以是串行扫描、分块并行扫描等等。该方法易于扩展至外存的关键是:在已预读取SA各块内的X的LMS子串的基础上,外存方法下,此步骤中的所有操作都仅需串行读写外存中的数据。
(1)先将SA中分散的LMS子串压缩到SA左侧,然后多线程并行处理包括LMS子串的这部分SA各块内的LMS子串大小比较任务,再根据大小比较的结果串行命名所有LMS子串得到中间字符串S1;
(2)从右至左分块流水并行扫描S1,在扫描过程中将S型字符重命名为其在S1的后缀数组中对应桶的尾部位置,获得X1。
S305、判断X1中所有字符是否都唯一?
若X1中所有字符都唯一,则转入S306,否则以X1作为输入,转入步骤S301。
S306、直接计算X1的SA1并扫描,将排序好的X的LMS后缀放入SA内其所属的数据块中。
此步骤中,可以先在存储单元中开辟SA1所需的存储空间,然后可以使用特定方法1直接计算X1的后缀数组,存入SA1;再使用特定方法2从右向左扫描SA1,将SA1中排好序的X的所有LMS后缀放入它们在SA中所属的块内。特定方法1可以是基数排序等各种排序方法;特定方法2可以是串行扫描、分块并行扫描、分块流水并行扫描等等。该方法易于扩展至外存的关键是:LMS后缀被放入它们在SA中所属的块而非具体的桶。
(1)直接使用基数排序计算X1的后缀数组,存入SA1;
(2)将SA中的每个元素都初始化为EMPTY,初始化SA各块的块尾位置指向块的末尾。
(3)分块流水并行从右向左扫描SA1,对每一个扫描到的SA1[j],计算X1[SA1[j]]代表的LMS后缀在原X中的起始位置,然后将它放入SA内它所属的块的尾部,并将块尾位置向左移动一位。
S307、归纳排序X的所有后缀,存入SA。
此步骤中,在完成当前块i的前继字符读取任务的同时,利用多线程并行地完成,块i-1的块内后缀稳定排序任务、块i-2的块内后缀归纳排序任务及块i-3的排序结果写回任务。其中,该方法易于扩展至外存的关键是:首先,前继字符读取任务避免了在其它任务中外存下的随机访问;第二,前继后缀均先写回SA中其所属的块,再由块内后缀稳定排序任务放至块内的最终位置。
(1)初始化SA各块的块头位置指向块的开头。从左至右依次处理SA的每一个分块,令左边第一块为块0,多线程并行地完成以下四个任务:①当前块i的前继字符读取任务,在块i内,并行从左至右扫描SA,若SA[j]不为EMPTY,则读取X[SA[j]]及其前继字符X[SA[j]-1],若X[SA[j]-1]为L型,则将前述读取的信息存储在读缓存中;②块i-1的块内后缀稳定排序任务,初始化一个块内桶数组,根据首字符基数排序块内现有的后缀,将它们放入块内对应的字符桶内;③块i-2的块内后缀归纳排序任务,归纳排序块内已有后缀的L型前继后缀,前继后缀的信息从读缓存中获取,如果前继后缀为L型且其所属的块为块i-2,则将SA[j]-1直接写入块i-2的对应桶内,如果前继后缀为L型且其所属的块为后续其他块,则将SA[j]-1顺序存入前继后缀所属的块对应的写缓存中;④块i-3的排序结果写回任务,读取写缓存,将由块i-3的块内后缀归纳排序任务所推导得到的、属于后续所有块的L型前继后缀按块并行顺序写回它们所属块的块头位置,每写入一个,块头位置右移一位。
(2)初始化SA各块的块尾位置指向块的末尾。从右至左依次处理SA的每一个分块,令右边第一块为块0,多线程并行地完成以下四个任务:①当前块i的前继字符读取任务,在块i内,并行从右至左扫描SA,若SA[j]不为EMPTY则读取X[SA[j]]及其前继字符X[SA[j]-1],若X[SA[j]-1]为S型,则将前述读取的信息存储在读缓存中;②块i-1的块内后缀稳定排序任务,初始化一个块内桶数组,根据首字符基数排序块内现有的后缀,将它们放入块内对应的字符桶内;③块i-2的块内后缀归纳排序任务,归纳排序块内已有后缀的S型前继后缀,前继后缀的信息从读缓存中获取,如果前继后缀为S型且其所属的块为块i-2,则将SA[j]-1直接写入块i-2的对应桶内,如果前继后缀为S型且其所属的块为后续其他块,则将SA[j]-1顺序存入前继后缀所属的块对应的写缓存中;④块i-3的排序结果写回任务,读取写缓存,将由块i-3的块内后缀归纳排序任务所推导得到的、属于后续所有块的S型前继后缀按块并行顺序写回它们所属块的块尾位置,每写入一个,块尾位置左移一位。
需要说明的是,此步骤中,所阐述的四个任务仅包含其基本点,在实际***模块中因工程实现的优劣问题可能会有多种实现方式。
S308、结束。
需要说明的是,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
参照图4,示出了本申请一个实施例的一种分块并行构造后缀数组的***的示意图,具体可以包括如下模块:
数据块划分模块401,用于针对任一字符串,将用于存储所述字符串的后缀数组的存储单元划分为多个数据块,所述字符串包括多个LMS字符,各个LMS字符分别对应一个以所述LMS字符为起始的LMS子串和LMS后缀;
LMS子串存储模块402,用于获取各个数据块的定位信息,根据所述定位信息将所述多个LMS子串分别存入所述各个数据块;
LMS子串排序模块403,用于并行地归纳排序所述各个数据块中的各个LMS子串;
目标字符串生成模块404,用于重命名归纳排序后的所述各个LMS子串,获得目标字符串,所述目标字符串包括多个目标字符,任一目标字符与所述字符串的一个LMS子串对应;
调用模块405,用于若所述目标字符串中至少存在一个目标字符不唯一,则以所述目标字符串作为输入的字符串,调用所述数据块划分模块,否则调用LMS后缀存储模块;
LMS后缀存储模块406,用于计算所述目标字符串的后缀数组,根据所述目标字符串的后缀数组将所述字符串的LMS后缀存入所述各个数据块;
后缀数组排序模块407,用于根据所述各个数据块中的LMS后缀,并行地归纳排序得到所述字符串的后缀数组。
在本申请实施例中,所述数据块划分模块401具体可以包括如下子模块:
存储单元分配子模块,用于针对任一字符串,为所述字符串和所述字符串的后缀数组分配存储单元;
数据块划分子模块,用于根据预设的划分方式,将所述后缀数组的存储单元划分为多个数据块。
在本申请实施例中,所述定位信息包括边界字符信息,所述LMS子串存储模块402具体可以包括如下子模块:
字符次数统计子模块,用于统计所述字符串中各个字符出现的次数;
边界字符信息计算子模块,用于根据所述各个字符出现的次数,采用前缀和算法计算所述各个数据块的边界字符信息。
在本申请实施例中,所述LMS子串存储模块402还可以包括如下子模块:
第一数据块初始化子模块,用于对所述各个数据块进行初始化处理,使所述各个数据块的块尾位置指向所述数据块的末尾;
字符串扫描子模块,用于从右向左并行扫描所述字符串,若当前扫描到的字符为LMS字符,则确定以所述LMS字符为起始的目标LMS子串,根据所述定位信息将所述目标LMS子串存入其所属的目标数据块的块尾位置并更新所述块尾位置。
在本申请实施例中,所述LMS子串排序模块403具体可以包括如下子模块:
第一数据块确定子模块,用于先从左向右、再从右向左扫描所述各个数据块,在扫描过程中确定当前数据块,以及所述当前数据块的多个相邻数据块;
第二数据块初始化子模块,用于在从左向右扫描各个数据块进行归纳排序之前,对所述各个数据块进行初始化处理,使所述各个数据块的块头位置指向所述数据块的开头,以及随后在从右向左扫描各个数据块进行归纳排序之前,对所述各个数据块进行初始化处理,使所述各个数据块的块尾位置指向所述数据块的末尾;
子串处理子模块,用于并行地对所述当前数据块中的各个子串和所述多个相邻数据块中的各个子串执行数据处理任务,所述各个子串包括各个LMS子串,所述数据处理任务包括前继字符读取任务、块内子串稳定排序任务、块内子串归纳排序任务和排序结果写回任务;
当所述当前数据块中的各个子串和所述多个相邻数据块中的各个子串均完成全部所述数据处理任务时,停止执行所述数据处理任务。
在本申请实施例中,所述目标字符串生成模块404具体可以包括如下子模块:
字符位置顺序确定子模块,用于确定任意相邻两个LMS子串中各个字符的位置顺序;
字典序大小比较子模块,用于逐一比较所述相邻两个LMS子串中具有相同位置顺序的两个字符的字典序大小;
重命名子模块,用于若所述相邻两个LMS子串的各相同位置顺序的字符的字典序大小均相同,则将后一LMS子串的名称重命名为与前一LMS子串的名称相同;若所述相邻两个LMS子串的各相同位置顺序的字符的字典序大小存在不相同的情况,则采用预设命名算法重命名后一LMS子串的名称,得到目标字符串,所述预设命名算法包括串行命名、并行命名再用前缀和算法整合各块的局部名字中的至少一种。
在本申请实施例中,所述后缀数组排序模块407具体可以包括如下子模块:
第二数据块确定子模块,用于先从左向右、再从右向左扫描所述各个数据块,在扫描过程中确定当前数据块,以及所述当前数据块的多个相邻数据块;
第三数据块初始化子模块,用于在从左向右扫描各个数据块进行归纳排序之前,对所述各个数据块进行初始化处理,使所述各个数据块的块头位置指向所述数据块的开头,以及随后在从右向左扫描各个数据块进行归纳排序之前,对所述各个数据块进行初始化处理,使所述各个数据块的块尾位置指向所述数据块的末尾;
后缀处理子模块,用于并行地对所述当前数据块中的各个后缀和所述多个相邻数据块中的各个后缀执行数据处理任务,所述各个后缀包括各个LMS后缀,所述数据处理任务包括前继字符读取任务、块内后缀稳定排序任务、块内后缀归纳排序任务和排序结果写回任务;
当所述当前数据块中的各个后缀和所述多个相邻数据块中的各个后缀均完成全部所述数据处理任务时,停止执行所述数据处理任务。
对于***实施例而言,由于其与方法实施例基本相似,所以描述得比较简单,相关之处参见方法实施例部分的说明即可。
参照图5,示出了本申请一个实施例的一种终端设备的示意图。如图5所示,本实施例的终端设备500包括:处理器510、存储器520以及存储在所述存储器520中并可在所述处理器510上运行的计算机程序521。所述处理器510执行所述计算机程序521时实现上述分块并行构造后缀数组的方法各个实施例中的步骤,例如图1所示的步骤S101至S107。或者,所述处理器510执行所述计算机程序521时实现上述各装置实施例中各模块/单元的功能,例如图4所示模块401至407的功能。
示例性的,所述计算机程序521可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器520中,并由所述处理器510执行,以完成本申请。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段可以用于描述所述计算机程序521在所述终端设备500中的执行过程。例如,所述计算机程序521可以被分割成数据块划分模块、LMS子串存储模块、LMS子串排序模块、目标字符串生成模块、调用模块、LMS后缀存储模块和后缀数组排序模块,各模块具体功能如下:
数据块划分模块,用于针对任一字符串,将用于存储所述字符串的后缀数组的存储单元划分为多个数据块,所述字符串包括多个LMS字符,各个LMS字符分别对应一个以所述LMS字符为起始的LMS子串和LMS后缀;
LMS子串存储模块,用于获取各个数据块的定位信息,根据所述定位信息将所述多个LMS子串分别存入所述各个数据块;
LMS子串排序模块,用于并行地归纳排序所述各个数据块中的各个LMS子串;
目标字符串生成模块,用于重命名归纳排序后的所述各个LMS子串,获得目标字符串,所述目标字符串包括多个目标字符,任一目标字符与所述字符串的一个LMS子串对应;
调用模块,用于若所述目标字符串中至少存在一个目标字符不唯一,则以所述目标字符串作为输入的字符串,调用所述数据块划分模块,否则调用LMS后缀存储模块;
LMS后缀存储模块,用于计算所述目标字符串的后缀数组,根据所述目标字符串的后缀数组将所述字符串的LMS后缀存入所述各个数据块;
后缀数组排序模块,用于根据所述各个数据块中的LMS后缀,并行地归纳排序得到所述字符串的后缀数组。
所述终端设备500可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。所述终端设备500可包括,但不仅限于,处理器510、存储器520。本领域技术人员可以理解,图5仅仅是终端设备500的一种示例,并不构成对终端设备500的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述终端设备500还可以包括输入输出设备、网络接入设备、总线等。
所述处理器510可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
所述存储器520可以是所述终端设备500的内部存储单元,例如终端设备500的硬盘或内存。所述存储器520也可以是所述终端设备500的外部存储设备,例如所述终端设备500上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(SecureDigital,SD)卡,闪存卡(Flash Card)等等。进一步地,所述存储器520还可以既包括所述终端设备500的内部存储单元也包括外部存储设备。所述存储器520用于存储所述计算机程序521以及所述终端设备500所需的其他程序和数据。所述存储器520还可以用于暂时地存储已经输出或者将要输出的数据。
以上所述实施例仅用以说明本申请的技术方案,而非对其限制。尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围,均应包含在本申请的保护范围之内。
Claims (8)
1.一种分块并行构造后缀数组的方法,其特征在于,包括:
针对任一字符串,将用于存储所述字符串的后缀数组的存储单元划分为多个数据块,所述字符串包括多个LMS字符,各个LMS字符分别对应一个以所述LMS字符为起始的LMS子串和LMS后缀;
获取各个数据块的定位信息,根据所述定位信息将所述各个LMS字符对应的LMS子串分别存入所述各个数据块;
并行地归纳排序所述各个数据块中的各个LMS子串;
重命名归纳排序后的所述各个LMS子串,获得目标字符串,所述目标字符串包括多个目标字符,任一目标字符与所述字符串的一个LMS子串对应;
若所述目标字符串中至少存在一个目标字符不唯一,则以所述目标字符串作为输入的字符串,返回执行所述将用于存储所述字符串的后缀数组的存储单元划分为多个数据块的步骤;
若所述目标字符串中各个目标字符均唯一,则计算所述目标字符串的后缀数组,根据所述目标字符串的后缀数组将所述字符串的LMS后缀存入所述各个数据块;根据所述各个数据块中的LMS后缀,并行地归纳排序得到所述字符串的后缀数组;
其中,所述并行地归纳排序所述各个数据块中的各个LMS子串的步骤包括:
先从左向右、再从右向左扫描所述各个数据块,在扫描过程中确定当前数据块,以及所述当前数据块的多个相邻数据块;
并行地对所述当前数据块中的各个子串和所述多个相邻数据块中的各个子串执行数据处理任务,所述各个子串包括各个LMS子串,所述数据处理任务包括前继字符读取任务、块内子串稳定排序任务、块内子串归纳排序任务和排序结果写回任务;
当所述当前数据块中的各个子串和所述多个相邻数据块中的各个子串均完成全部所述数据处理任务时,停止执行所述数据处理任务;
所述重命名归纳排序后的所述各个LMS子串,获得目标字符串的步骤包括:
确定任意相邻两个LMS子串中各个字符的位置顺序;
逐一比较所述相邻两个LMS子串中具有相同位置顺序的两个字符的字典序大小;
若所述相邻两个LMS子串的各相同位置顺序的字符的字典序大小均相同,则将后一LMS子串的名称重命名为与前一LMS子串的名称相同;
若所述相邻两个LMS子串的各相同位置顺序的字符的字典序大小存在不相同的情况,则采用预设命名算法重命名后一LMS子串的名称,得到目标字符串,所述预设命名算法包括串行命名、并行命名再用前缀和算法整合各块的局部名字中的至少一种。
2.根据权利要求1所述的方法,其特征在于,所述针对任一字符串,将用于存储所述字符串的后缀数组的存储单元划分为多个数据块的步骤包括:
针对任一字符串,为所述字符串和所述字符串的后缀数组分配存储单元;
根据预设的划分方式,将所述后缀数组的存储单元划分为多个数据块。
3.根据权利要求1所述的方法,其特征在于,所述定位信息包括边界字符信息,所述获取各个数据块的定位信息的步骤包括:
统计所述字符串中各个字符出现的次数;
根据所述各个字符出现的次数,采用前缀和算法计算所述各个数据块的边界字符信息。
4.根据权利要求1所述的方法,其特征在于,所述根据所述定位信息将所述各个LMS字符对应的LMS子串分别存入所述各个数据块的步骤包括:
对所述各个数据块进行初始化处理,使所述各个数据块的块尾位置指向所述数据块的末尾;
并行从右向左扫描所述字符串,若当前扫描到的字符为LMS字符,则确定以所述LMS字符为起始的目标LMS子串,根据所述定位信息将所述目标LMS子串存入其所属的目标数据块的块尾位置并更新所述块尾位置。
5.根据权利要求1所述的方法,其特征在于,所述根据所述各个数据块中的LMS后缀,并行地归纳排序得到所述字符串的后缀数组的步骤包括:
先从左向右、再从右向左扫描所述各个数据块,在扫描过程中确定当前数据块,以及所述当前数据块的多个相邻数据块;
并行地对所述当前数据块中的各个后缀和所述多个相邻数据块中的各个后缀执行数据处理任务,所述各个后缀包括各个LMS后缀,所述数据处理任务包括前继字符读取任务、块内后缀稳定排序任务、块内后缀归纳排序任务和排序结果写回任务;
当所述当前数据块中的各个后缀和所述多个相邻数据块中的各个后缀均完成全部所述数据处理任务时,停止执行所述数据处理任务。
6.一种分块并行构造后缀数组的***,其特征在于,包括:
数据块划分模块,用于针对任一字符串,将用于存储所述字符串的后缀数组的存储单元划分为多个数据块,所述字符串包括多个LMS字符,各个LMS字符分别对应一个以所述LMS字符为起始的LMS子串和LMS后缀;
LMS子串存储模块,用于获取各个数据块的定位信息,根据所述定位信息将所述各个LMS字符对应的LMS子串分别存入所述各个数据块;
LMS子串排序模块,用于并行地归纳排序所述各个数据块中的各个LMS子串;
目标字符串生成模块,用于重命名归纳排序后的所述各个LMS子串,获得目标字符串,所述目标字符串包括多个目标字符,任一目标字符与所述字符串的一个LMS子串对应;
调用模块,用于若所述目标字符串中至少存在一个目标字符不唯一,则以所述目标字符串作为输入的字符串,调用所述数据块划分模块,否则调用LMS后缀存储模块;
LMS后缀存储模块,用于计算所述目标字符串的后缀数组,根据所述目标字符串的后缀数组将所述字符串的LMS后缀存入所述各个数据块;
后缀数组排序模块,用于根据所述各个数据块中的LMS后缀,并行地归纳排序得到所述字符串的后缀数组;
其中,所述LMS子串排序模块具体用于:先从左向右、再从右向左扫描所述各个数据块,在扫描过程中确定当前数据块,以及所述当前数据块的多个相邻数据块;并行地对所述当前数据块中的各个子串和所述多个相邻数据块中的各个子串执行数据处理任务,所述各个子串包括各个LMS子串,所述数据处理任务包括前继字符读取任务、块内子串稳定排序任务、块内子串归纳排序任务和排序结果写回任务;当所述当前数据块中的各个子串和所述多个相邻数据块中的各个子串均完成全部所述数据处理任务时,停止执行所述数据处理任务;
所述目标字符串生成模块具体用于:确定任意相邻两个LMS子串中各个字符的位置顺序;逐一比较所述相邻两个LMS子串中具有相同位置顺序的两个字符的字典序大小;若所述相邻两个LMS子串的各相同位置顺序的字符的字典序大小均相同,则将后一LMS子串的名称重命名为与前一LMS子串的名称相同;若所述相邻两个LMS子串的各相同位置顺序的字符的字典序大小存在不相同的情况,则采用预设命名算法重命名后一LMS子串的名称,得到目标字符串,所述预设命名算法包括串行命名、并行命名再用前缀和算法整合各块的局部名字中的至少一种。
7.一种终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至5任一项所述分块并行构造后缀数组的方法的步骤。
8.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至5任一项所述分块并行构造后缀数组的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910992637.6A CN110837584B (zh) | 2019-10-18 | 2019-10-18 | 一种分块并行构造后缀数组的方法及*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910992637.6A CN110837584B (zh) | 2019-10-18 | 2019-10-18 | 一种分块并行构造后缀数组的方法及*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110837584A CN110837584A (zh) | 2020-02-25 |
CN110837584B true CN110837584B (zh) | 2022-10-04 |
Family
ID=69575426
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910992637.6A Active CN110837584B (zh) | 2019-10-18 | 2019-10-18 | 一种分块并行构造后缀数组的方法及*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110837584B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111639054B (zh) * | 2020-05-29 | 2023-11-07 | 中国人民解放军国防科技大学 | 一种海洋模式与资料同化的数据耦合方法、***及介质 |
CN112765938B (zh) * | 2021-01-13 | 2024-02-09 | 中山大学 | 构造后缀数组的方法、终端设备及计算机可读存储介质 |
CN112765421B (zh) * | 2021-01-13 | 2024-01-02 | 中山大学 | 一种数据检索方法及装置、终端设备 |
CN115525795B (zh) * | 2021-06-25 | 2024-01-30 | 中科寒武纪科技股份有限公司 | 一种在多核处理器中对数据进行排序的方法 |
CN114003007A (zh) * | 2021-10-28 | 2022-02-01 | 国家石油天然气管网集团有限公司华南分公司 | 一种基于控制***运行数据的分析方法及相关装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110019016A (zh) * | 2017-12-29 | 2019-07-16 | 北京忆恒创源科技有限公司 | 提供逻辑键的kv存储设备及其方法 |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3672242B2 (ja) * | 2001-01-11 | 2005-07-20 | インターナショナル・ビジネス・マシーンズ・コーポレーション | パターン検索方法、パターン検索装置、コンピュータプログラム及び記憶媒体 |
CN104572994B (zh) * | 2015-01-06 | 2018-12-14 | 华为技术有限公司 | 用于搜索数据的方法和装置 |
CN105005464B (zh) * | 2015-07-02 | 2017-10-10 | 东南大学 | 一种Burrows Wheeler变换硬件处理装置 |
CN108595508B (zh) * | 2018-03-22 | 2020-11-13 | 佛山市顺德区中山大学研究院 | 一种基于后缀数组的自适应索引构建方法及*** |
CN108628953B (zh) * | 2018-04-08 | 2022-02-15 | 中山大学 | 一种基于fpga的并行字符串匹配算法 |
CN108804204A (zh) * | 2018-04-17 | 2018-11-13 | 佛山市顺德区中山大学研究院 | 多线程并行构造后缀数组的方法及*** |
CN108595917A (zh) * | 2018-06-29 | 2018-09-28 | 中国科学技术大学苏州研究院 | 基于fpga的面向基因测序串匹配算法的加速平台及设计方法 |
CN109375989B (zh) * | 2018-09-10 | 2022-04-08 | 中山大学 | 一种并行后缀排序方法及*** |
-
2019
- 2019-10-18 CN CN201910992637.6A patent/CN110837584B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110019016A (zh) * | 2017-12-29 | 2019-07-16 | 北京忆恒创源科技有限公司 | 提供逻辑键的kv存储设备及其方法 |
Also Published As
Publication number | Publication date |
---|---|
CN110837584A (zh) | 2020-02-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110837584B (zh) | 一种分块并行构造后缀数组的方法及*** | |
US20230126005A1 (en) | Consistent filtering of machine learning data | |
US20220335338A1 (en) | Feature processing tradeoff management | |
Lemire et al. | Roaring bitmaps: Implementation of an optimized software library | |
US10339465B2 (en) | Optimized decision tree based models | |
JP6639420B2 (ja) | フラッシュ最適化データ・レイアウトのための方法、フラッシュ最適化記憶のための装置、およびコンピュータ・プログラム | |
US9672474B2 (en) | Concurrent binning of machine learning data | |
JP6605573B2 (ja) | 並列ディシジョン・ツリー・プロセッサー・アーキテクチャ | |
US10318882B2 (en) | Optimized training of linear machine learning models | |
Pan et al. | Fast GPU-based locality sensitive hashing for k-nearest neighbor computation | |
CN110852046B (zh) | 一种文本后缀索引的分块归纳排序方法及*** | |
Li et al. | Wham: a high-throughput sequence alignment method | |
CN110612513B (zh) | 用于使用可变级并行执行数据处理操作的***和方法 | |
US9442694B1 (en) | Method for storing a dataset | |
US20160364421A1 (en) | Database index for constructing large scale data level of details | |
Ferraro Petrillo et al. | Analyzing big datasets of genomic sequences: fast and scalable collection of k-mer statistics | |
Manca et al. | CUDA‐quicksort: an improved GPU‐based implementation of quicksort | |
CN110704424B (zh) | 一种应用于数据库的排序方法、装置及相关设备 | |
CN113268485B (zh) | 数据表关联分析方法、装置、设备及存储介质 | |
CN111028897A (zh) | 一种基于Hadoop的基因组索引构建的分布式并行计算方法 | |
Ganapathi et al. | Parallel divide-and-conquer algorithms for bubble sort, selection sort and insertion sort | |
CN113544683B (zh) | 数据一般化装置、数据一般化方法、程序 | |
Han et al. | Succinct suffix sorting in external memory | |
US9659061B2 (en) | Method for efficient aggregation of numerous data using sparse bit sets | |
Niu et al. | A developed apriori algorithm based on frequent matrix |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |