CN115982311B - 一种链表的生成方法、装置、终端设备及存储介质 - Google Patents
一种链表的生成方法、装置、终端设备及存储介质 Download PDFInfo
- Publication number
- CN115982311B CN115982311B CN202310277190.0A CN202310277190A CN115982311B CN 115982311 B CN115982311 B CN 115982311B CN 202310277190 A CN202310277190 A CN 202310277190A CN 115982311 B CN115982311 B CN 115982311B
- Authority
- CN
- China
- Prior art keywords
- suffix
- linked list
- sub
- suffixes
- character
- 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
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请实施例适用于计算机技术领域,提供了一种链表的生成方法、装置、终端设备及存储介质,所述方法包括:根据原始字符串中各个第一后缀的后缀位置生成第一链表,并根据所述第一链表生成多个子链表;所述第一链表中包括多个存储在后缀位置的第一后缀;所述第一后缀为所述原始字符串中字符类型为第一类型的字符对应的后缀;所述第一链表是由多个第一后缀基于所述第一后缀的字典顺序链接而成;调用至少N条并行线程读取所述子链表内的至少N个第二后缀,确定各个所述第二后缀的前继元组,并根据所述前继元组依次连接各个所述第二后缀,得到第二链表;根据所述第二链表生成后缀链表。根据本实施例的方法生成后缀链表,可以提高后缀链表的生成效率。
Description
技术领域
本申请实施例属于计算机技术领域,特别是涉及一种链表的生成方法、装置、终端设备及存储介质。
背景技术
后缀链表,是一种按照字符串后缀的顺序信息链接起来的后缀单链表,后缀链表中的每一个后缀都指向比它大或者比它小的下一个后缀的位置。由于后缀链表是一种可以基于后缀进行全文索引的数据结构,因此后缀链表常被应用于数据压缩领域。现有技术中,常采用归纳排序的方法对字符串的多个后缀进行排序并生成后缀链表,但当字符串长度较大时,字符串中的后缀数量更为庞大,使用现有技术中的归纳排序方法构建后缀链表需要耗费大量时间。
发明内容
有鉴于此,本申请实施例提供了一种链表的生成方法,用以提高后缀链表的生成效率。
本申请实施例的第一方面提供了一种链表的生成方法,包括:
根据原始字符串中各个第一后缀的后缀位置生成第一链表,并根据所述第一链表生成多个子链表;所述子链表包括多个第二后缀;所述第二后缀为所述原始字符串中字符类型为与第一类型不同的字符对应的后缀;所述第一链表中包括多个存储在后缀位置的第一后缀;所述第一后缀为所述原始字符串中字符类型为第一类型的字符对应的后缀;所述第一链表是由多个第一后缀基于所述第一后缀的字典顺序链接而成;所述后缀位置由所述后缀的后缀首字符在原始字符串中的位置确定;
调用至少N条并行线程读取所述子链表内的至少N个第二后缀,确定各个所述第二后缀的前继元组,并根据所述前继元组依次连接各个所述第二后缀,得到第二链表;所述N为大于2的正整数;
根据所述第二链表生成后缀链表。
本申请实施例的第二方面提供了一种链表的生成装置,包括:
第一链表生成模块,用于根据原始字符串中各个原始字符串的位置生成第一链表,并根据所述第一链表生成多个子链表;所述子链表包括多个第二后缀;所述第二后缀为所述原始字符串中字符类型为与第一类型不同的字符对应的后缀;所述第一链表中包括多个存储在后缀位置的第一后缀;所述第一后缀为所述原始字符串中字符类型为第一类型的字符对应的后缀;所述第一链表是由多个第一后缀基于所述第一后缀的字典顺序链接而成;所述后缀位置由所述后缀的后缀首字符在原始字符串中的位置确定;
第二链表生成模块,用于调用至少N条并行线程读取所述子链表内的至少N个第二后缀,确定各个所述第二后缀的前继元组,并根据所述前继元组依次连接各个所述第二后缀,得到第二链表;所述N为大于2的正整数;
后缀链表生成模块,用于根据所述第二链表生成后缀链表。
本申请实施例的第三方面提供了一种终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上述第一方面所述的链表的生成方法。
本申请实施例的第四方面提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如上述第一方面所述的链表的生成方法。
本申请实施例的第五方面提供了一种计算机程序产品,当所述计算机程序产品在计算机上运行时,使得所述计算机执行上述第一方面所述的链表的生成方法。
与现有技术相比,本申请实施例具有以下优点:
在本申请实施例中,电子设备可以通过原始字符串中各个第一后缀对应的后缀位置生成第一链表。生成第一链表后电子设备可以调用至少N条并行线程基于第一链表生成第二链表。最终,电子设备可以根据第二链表生成后缀链表。在本申请实施例中,电子设备可以通过至少N条并行线程生成第二链表,因此,通过本申请实施例提供的方法生成后缀链表可以实现后缀链表的快速计算,显著提高后缀链表的生成效率。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍。显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的字符串X的后缀数组和后缀链表存储结构示意图;
图2是本申请实施例提供的字符串X的后缀数组的元素示意图;
图3是本申请实施例提供的字符串X的两种后缀链表的结构示意图;
图4是本申请实施例提供的一种链表的生成方法的示意图;
图5是本申请实施例提供的S402一种可能实现方式的示意图;
图6为本申请实施例提供的一种流水线并行执行的三种线程执行顺序示意图;
图7本申请实施例提供的一种两个执行周期的体系结构图;
图8是本申请实施例提供的一种链表的生成装置的示意图;
图9是本申请实施例提供的一种终端设备的示意图。
具体实施方式
以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透彻理解本申请实施例。然而,本领域技术人员应当清楚,在没有这些具体细节的其他实施例中也可以实现本申请。在其他情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本申请的描述。
现今由于网络通信和应用软件都可以产生大量结构、半结构或非结构化的数据,因此为了满足用户对不同格式数据的查询需求,电子设备可以通过构建全文索引的方法来实现对不同合适数据的查询。此外,电子设备还可以结合各种查询技术,来满足用户复杂的查询需求。后缀数组(Suffix Array,SA)就是一种全文索引数据结构,后缀数组中保存着原始字符串的所有后缀的顺序信息。因此后缀数组在全文索引、模式匹配、数据压缩和生物信息学等领域都有着广泛的应用。假设某原始字符串X的长度为n,每个字符占1个字节,则原始字符串X可以包含n个长度不同的后缀。用suf(X, i)可以表示原始字符串X中的任一后缀,该后缀的后缀首字符可以是原始字符串X中位于字符位置i的字符,并且该后缀的结束字符可以是原始字符串X中位于结尾位置的字符,其中i∈[1,n]。电子设备对X的n个后缀按字典顺序排序,并将其开始位置从左至右依次保存到一个长度为n的整型数组,电子设备便可以生成X的后缀数组。其中,X的后缀数组是基于顺序结构的后缀索引。
LZ77因子分解是A. Lemple和J. Ziv于1977年提出的一种基于字典的无损压缩算法。LZ77因子分解对于具有高重复特征的文本和生物信息等数据,具有很高的压缩率。著名的压缩软件gzip和7-zip都用到了LZ77因子分解算法。该算法主要包括两个阶段:预备阶段和解析阶段。在预备阶段,算法主要对输入字符串的后缀进行排序,按照升序或降序将后缀链接起来,形成升序或降序的后缀单链表,即形成基于链式结构的后缀索引。在解析阶段,算法可以遍历后缀链表,并依次计算字符串的LZ77因子。根据现有相关文献提供的实验数据,预备阶段的计算时间占LZ77因子分解总时间的九成以上,是整个算法的性能瓶颈。
目前,基于原始字符串生成后缀链表的方法大致分成两类。第一类方法计算速度快,却占用内存空间较大。第二类方法采用归纳排序(Induced Sorting,IS)方法对后缀进行排序,以实现较优的空间性能。但第二类方法计算速度较慢,但占用内存空间小。理想的后缀链表生成方法应该满足占用内存空间小、具有较快的计算速度两大要求。随着现代计算机并行计算能力的迅速增长,本申请可以在不明显增加内存开销的前提下,充分利用多核计算机的并行计算能力,实现后缀链表的快速计算。
首先,关于本申请实施例可能涉及的名词,在此进行说明。
字符串X:由n个字符X[1]...X[n]组成的字符数组X[1, n],其中结尾字符X[n]是唯一出现且字典序最小的字符;其中,X的字符集可以用Σ表示。其中,字典序(dictionaryorder),又称字母序(alphabetical order),原意是表示英文单词在字典中的先后顺序,在计算机领域中扩展为根据英文单词在字典中的先后顺序确定的两个任意字符串的大小关系。
字符类型:字符串X中的字符分为L和S两种类型。如果字符X [i]满足X [i]<X [i+1],或满足X[i]=X[i+1]且X[i+1]为S类型时,1≤i≤n-1,则字符X [i]可以为S类型字符(又称正序字符),否则字符X [i]为L类型字符(又称逆序字符)。进一步地,如果X [i-1]为L类型字符,且X [i]为S类型字符时,那么X [i]为S*类型(又称特殊正序字符)。其中,S*类型是S类型字符的子类型。特别的,结尾字符X [n]可以为S*类型字符。
后缀类型:后缀的类型由其后缀首字符的字符类型决定,因此后缀可以分为L和S两种类型,其中S*类型后缀是S类型后缀的子集。
前继字符:后缀X[i, n]的前继字符可以为X[i-1]。
前继后缀:后缀X[i, n]的前继后缀可以为后缀X[i-1,n]。
后缀数组(SA):字符串X的后缀数组是一个长度为n的整型数组,后缀数组可以表示为SA(X)[1, n],后缀数组中可以从左至右按照后缀升序保存着多个后缀的开始位置。
升序后缀链表ψ:长度为n+1的基于数组的单链表,按照字典序升序将后缀链接起来便可以得到一个后缀链表ψ。其中,ψ[0]可以为后缀链表ψ的链表头,ψ[0]可以指向字符串X的最小后缀。ψ[SA[n]]为后缀链表ψ的链表尾,ψ[SA[n]]可以指向链表头ψ[0]。后缀链表ψ中的其他链表节点可以指向比它大的下一个后缀的开始位置。进一步,链表ψL可以表示L类型后缀升序单链表,将L类型后缀按照升序链接到L类型位置中,便可以生成链表ψL。在本申请实施例中,链表ψL还可以称为逆序类型后缀升序单链表。表ψS可以表示S类型后缀升序单链表,将S类型后缀按照升序链接到S类型位置中,便可以生成链表ψS。在本申请实施例中,链表ψS还可以称为正序类型后缀升序单链表。表ψS*可以表示S*类型后缀升序单链表,将S*类型后缀按照升序链接到S*类型位置中,便可以生成链表ψS*。在本申请实施例中,链表ψS*还可以称为特殊正序类型后缀升序单链表。
降序后缀链表φ:长度为n+1的基于数组的单链表,按照字典序降序将后缀链接起来便可以得到一个后缀链表φ。其中,φ[0]可以为后缀链表φ的链表头,φ[0]可以指向字符串X中的最大后缀。φ[SA[n]]可以为后缀链表φ的链表尾,φ[SA[n]]可以指向链表头φ[0]。后缀链表φ中的其他链表节点可以指向比它小的下一个后缀的开始位置。进一步,链表φL可以表示L类型后缀降序单链表,其中链表φL可以通过将多个L类型后缀按照降序链接到L类型后缀的链接位置的方式生成。在本申请实施例中,链表φL还可以称为逆序类型后缀降序单链表。链表φS可以表示S类型后缀降序单链表,其中链表φS可以通过将多个S类型后缀按照降序链接到S类型后缀的链接位置的方式生成。在本申请实施例中,链表φS还可以称为正序类型后缀降序单链表。链表φS*可以表示S*类型后缀降序单链表,其中链表φS*可以通过将多个S*类型后缀按照降序链接到S*类型后缀的链接位置的方式生成。在本申请实施例中,链表φS*还可以称为特殊正序类型后缀降序单链表。
后缀链表的归纳排序过程:第一步,对S*类型后缀进行排序,计算生成链表ψS*;第二步,遍历链表ψS*,归纳推导多个L类型后缀的顺序,生成链表φL;第三步,遍历链表φL,归纳推导多个S类型后缀顺序,计算生成链表φS。其中,归纳排序可以是原地排序。在构造后缀链表的过程中,后缀数组SA以及不同类型的后缀链表φ和ψ都复用工作数组A的存储空间。数组A中各元素的元素类型与字符串X中各个字符的字符类型一一对应。例如,如果X[i]为L类型的字符,则A[i]也为L类型的数组元素。
桶链表:以相同字符c开始的L类型后缀链接起来形成的单链表可以称为c的L型桶链表。以相同字符c开始的S类型后缀链接起来形成的单链表可以称为c的S型桶链表。为便于表述,可以分别用数组LBs[|Σ|]和LBe[|Σ|]记录各L类型桶链表的开始和结束指针,可以分别用数组SBs[|Σ|]和SBe[|Σ|]记录各S类型桶链表的开始和结束指针。
需要说明的是,在本申请实施例中,升序或降序可以由各个后缀的字典序决定。多个正序后缀按字典序降序链接起来,可以生成降序正序链表。多个正序后缀按字典序升序链接起来可以生成升序正序链表。多个逆序后缀按字典序降序链接起来,可以生成降序逆序链表。多个逆序后缀按字典序升序链接起来可以生成升序逆序链表。
以字符串X[1,12]=“bbcbbabbcbba”为例,解释上述各个名词的具体内容:
如图1所示,为字符串X的后缀数组和后缀链表的存储结构示意图。
参见图1,示出了字符串X中的各个字符的具体字符类型。例如,在字符串X中由于字符X[02]=b的字典序小于字符X[03]=c的字典序,因此字符X[02]=b的字符类型可以为S类型;在字符串X中由于字符X[01]=b的字典序与字符X[02]=b的字典序相同,所以字符X[01]=b的字符类型可以由字符X[02]=b的字符类型决定,又由于字符X[02]的字符类型S类型,所以字符X[01]=b的字符类型可以为S类型。
参见图1,示出了字符串X的后缀数组的存储结构。其中,字符串X的后缀数组SA(X)可以是一个长度为n的整型数组,数组中可以保存X的多个已排序后缀的开始位置。例如,SA[01]=12中可以保存字符串X中字典序最小的后缀的开始位置12,该后缀可以由一个字符X[12]=a组成;SA[12]=03中可以保存字符串X中最大的后缀(suf(X, 03)=X[03, 12]=cbbabbcbba)的开始位置03。
如图2所示,为本申请实施例提供的字符串X的后缀数组的元素示意图。图2给出了字符串X的后缀数组SA(X)的各个元素所对应的后缀。其中,图2中的序号可以表示SA(X)的第几个元素,也可以理解为该元素对应的后缀的字典序或顺序。例如,第2个元素SA[02]=06,对应的后缀可以为X[06, 12]=abbcbba,它在X的后缀中的顺序可以为2。
如图3所示,为本申请实施例提供的字符串X的两种后缀链表的结构示意图。其中,字符串X的后缀链表可以包括升序后缀链表ψ(X)和降序后缀链表φ(X)。升序后缀链表ψ(X)和降序后缀链表φ(X)可以是长度为n+1的整型数组。图3给出了升序后缀链表ψ(X)和降序后缀链表φ(X)中的各个元素完整的链接顺序。在电子设备在遍历后缀链表时可以从后缀链表的链表头遍历整个链表,后缀链表的链表尾按照惯例指向链表头的位置。在后缀链表中首字符相同的后缀可以链接在一起构成一个桶链表,首字符相同的后缀构成的桶链表可以包括L类型桶链表和S类型桶链表。例如,以字符b开始的后缀链接在一起构成字符b的桶链表,该桶链表可以由以字符b为首字符的L类型桶链表和以字符b为首字符的S类型桶链表构成。
参见图3(a),为字符串X的升序后缀链表ψ(X)的结构示意图。其中,升序后缀链表ψ(X)可以由链表头、字符a的S类型桶链表、字符b的L类型桶链表、字符b的S类型桶链表和字符c的L类型桶链表依次链接而成。在升序后缀链表ψ(X)中,ψ[0]可以是升序后缀链表ψ(X)的链表头,ψ[0]可以指向字符串X的最小的后缀suf(X, 12)的后缀位置12。ψ[03]可以是升序后缀链表ψ(X)的链表尾,ψ[03]可以指向链表头ψ[0]。在升序后缀链表ψ(X)中,除了链表头和链表尾以外的其他位置i可以保存着比后缀suf(X, i)的字典序大的下一个后缀的后缀位置。例如,字典序比suf(X, 04)大的下一个后缀为后缀suf(X, 07),因此在升序后缀链表ψ(X)中ψ[04]可以指向ψ[07],即ψ[04]=07。
参见图3(b),为字符串X的降序后缀链表φ(X)的结构示意图。其中,降序后缀链表φ(X)可以由链表头、字符c的L类型桶链表、字符b的S类型桶链表、字符b的L类型桶链表和字符a的S类型桶链表依次链接而成。在降序后缀链表φ(X)中,φ[0]可以是降序后缀链表φ(X)的链表头,φ[0]可以指向字符串X的最大后缀suf(X, 03)的后缀位置03。φ[12]可以是降序后缀链表φ(X)的链表尾,φ[12]可以指向链表头φ[0]。在降序后缀链表φ(X)中,除了链表头和链表尾以外的其他位置i可以保存着比后缀suf(X, i)的字典序小的下一个后缀的后缀位置。例如,字典序比suf(X, 04)小的下一个后缀为后缀suf(X, 10),因此在降序后缀链表φ(X)中φ[04]可以指向φ[10],即φ[04]=10。
下面通过具体实施例来说明本申请的技术方案。
参照图4,示出了本申请实施例提供的一种链表的生成方法的示意图,该链表的生成方法可以用于多种电子设备中。其中,该电子设备可以为个人计算机、大型计算机、平板电脑等具有多核CPU和内存的电子设备,上述链表的生成方法具体可以包括如下步骤:
S401、根据原始字符串中各个第一后缀的位置生成第一链表,并根据所述第一链表生成多个子链表;所述子链表包括多个第二后缀;所述第二后缀为所述原始字符串中字符类型为与第一类型不同的字符对应的后缀;所述第一链表中包括多个存储在后缀位置的第一后缀;所述第一后缀为所述原始字符串中字符类型为第一类型的字符对应的后缀;所述第一链表是由多个第一后缀基于所述第一后缀的字典顺序链接而成;所述后缀位置由所述后缀的后缀首字符在原始字符串中的位置确定;
在本申请实施例中,电子设备可以先基于原始字符串确定原始字符串中的多个第一后缀和各个第一后缀对应的后缀位置。其中,第一后缀为原始字符串中字符类型为第一类型的字符对应的后缀。其中,第一类型可以是特殊正序类型或逆序类型。电子设备在确定多个第一后缀和各个第一后缀对应的后缀位置后,可以根据原始字符串中各个第一后缀的后缀位置生成第一链表。
电子设备生成的第一链表中可以包括多个存储在后缀位置的第一后缀。其中,由于后缀链表可以由多个节点构成,各个节点的位置与后缀对应,节点存储的数据可以看做指针域。因此,电子设备可以基于第一后缀的后缀位置,确定各个第一后缀所在的节点。在第一链表中,各个第一后缀的指针指向可以由第一后缀对应字符的字典序决定,即第一链表中的多个第一后缀可以基于字典顺序链接而成。电子设备在生成第一链表后,可以通过遍历第一链表的方式,根据第一链表生成多个子链表。其中,电子设备基于第一链表生成的子链表中,可以包括多个第二后缀。第二后缀为原始字符串中字符类型为与第一类型不同的字符对应的后缀。
在本实施例中,原始字符串可以包含多个多种不同类型的字符,如特殊正序字符和逆序字符。基于原始字符串中的多个字符可以生成多个后缀。字符串的后缀可以是该字符串起至字符串结尾。例如,若某原始字符串X = "bbcbbabbcbba"的长度为12,其后缀可以是其中任一位置i(1≤i≤12)开始至结尾位置12组成的字符串,后缀首字符可以是后缀的第一个字符。例如,在上述字符串X的后缀suf(X,10)=bba,其首字符可以是b。本申请实施例中,关于字符类型和后缀类型的说明可以参见说明书中名词说明部分的内容,在此不再赘述。
在一种可能实现方式中,电子设备在根据原始字符串生成第一链表之前可以通过扫描原始字符串,依次比较原始字符串中各个字符与其相邻字符之间的大小关系的方式确定各个字符类型。在确定原始字符串中各个字符类型后,可以将其字符类型记录于类型数组t中,例如,图1中字符串X各个字符的类型可以保存在类型数组t中,可以通过说明书中名词说明部分的内容计算字符类型,通过比较字符串X中各个字符X[i]与其后继字符X[i+1]的大小及其类型,确定X[i]的类型。例如,由于第1个位置的字符b的后继字符也为b,且为S类型,所以该位置的字符b为正序字符;第2个位置的字符b小于其后继字符c,所以该位置的字符为逆序字符;第6个位置字符a为正序字符,其前继字符b为逆序字符,因此该位置字符a可以为特殊正序字符;第12个位置上的字符a,按照惯例规定为特殊正序字符;其中,特殊正序字符同样属于正序字符,是正序字符中的一种特殊类型。本申请例用1和0分别代表正序字符和逆序字符,将原始字符串中各字符类型记录于数组t中时,则可以基于原始字符串X的各字符类型,生成X相应的字符类型数组t。因此,X的字符类型数组可以是t=110001110001,可以根据t数组计算X的特殊正序后缀,即suf(X, 06)=X[06,12]=abbcbba和suf(X, 12)=X[12]=a。
在本申请实施例中,第一链表可以包括特殊正序链表,当第一链表为特殊正序链表时,第一链表的生成方法可以如下所述:
在本申请实施例中,电子设备在基于某一原始字符串构造该原始字符串相应的特殊正序链表时,可以先获取该原始字符串对应的字符类型数组。根据获取到的原始字符串对应的字符类型数组,电子设备可以生成多个后缀首字符的字符类型为特殊正序类型的后缀,即电子设备可以基于字符类型数组生成多个特殊正序后缀。其中,字符类型数组可以是根据原始字符串中各个字符直接比较生成。字符串数组中可以包含原始字符串中各个字符的字符类型信息。
在本申请实施例中,电子设备在基于字符类型数组生成多个关于原始字符串的特殊正序后缀后,可以通过分治递归的方法对生成的多个特殊正序后缀进行排序,从而获得多个递归层。基于获得的多个递归层,通过归纳排序的方法,电子设备可以获得多个特殊正序后缀的第一顺序。
在本申请中,由于分治递归算法是通过将原始问题分解为多个子问题,分解出来的子问题互相独立且与原问题形式相同。通过递归地解分解出来的子问题,得到各个字问题的解,最后将各子问题的解合并得到原问题的解。因此,通过分治递归算法获得的多个递归层中可以包含部分特殊正序后缀的顺序。根据各个递归层中的部分特殊正序后缀的顺序,对各个递归层进行归纳排序,便可以获得原始字符串的多个特殊正序后缀的第一顺序。
在本申请实施例中,电子设备在确定关于原始字符串的多个特殊正序后缀的第一顺序后,可以根据字符类型数组确定原始字符串中的多个特殊正序后缀的后缀首字符的字符位置。根据各个特殊正序后缀在第一顺序中的次序和各个特殊正序后缀的后缀首字符在原始字符串中的字符位置,电子设备生成第一链表。其中,由于后缀链表可以由多个节点构成,各个节点中可以包括用于存储后缀本身的数据域和用于存储指针的指针域。因此,电子设备基于特殊正序后缀的后缀首字符的字符位置可以决定特殊正序后缀在第一链表中的特殊正序后缀位置,特殊正序后缀在第一顺序中的次序可以决定第一链表中各个特殊正序后缀的指针指向。
在另一种实现方式中,电子设备在基于各个特殊正序后缀的第一顺序生成第一链表时,可以先根据多个特殊正序后缀的第一顺序,将多个特殊正序后缀的开始位置按照第一顺序的升序写入特殊正序后缀数组中进行保存。其中,特殊正序后缀数组中可以从左至右按照特殊正序后缀的第一顺序升序保存着多个关于原始字符串的特殊正序后缀的开始位置。电子设备在生成特殊正序后缀数组后,可以通过扫描字符类型数组的方式,确定多个特殊类型字符在原始字符串中的字符位置。根据各个特殊类型字符在原始字符串中的字符位置,电子设备可以确定特殊正序后缀数组中的各个特殊正序后缀的后缀首字符的字符位置。
在本申请实施例中,电子设备在获取各个特殊正序后缀的位置后,可以通过从右往左依次扫描特殊正序后缀数组的方式,依次将多个特殊正序后缀按照特殊正序后缀在第一顺序中的降序次序,写入各个特殊正序后缀相应的临时位置中,以生成临时链表。其中,各个特殊正序后缀的临时位置可以是各个特殊正序后缀的后缀首字符在原始字符串中的字符位置的左邻位。
在本申请实施例中,由于特殊正序字符的前继字符可以为逆序字符,且特殊正序字符属于正序字符,因此特殊正序字符对应的字符位置的左邻位可以是逆序字符的位置。因此,电子设备在将多个特殊正序后缀按照降序次序写入临时位置,生成临时链表后,可以通过从右向左扫描特殊正序后缀数组的方式,依次将多个特殊正序后缀按照第一顺序的升序次序,从临时位置链接至特殊正序后缀位置中,以生成第一链表。其中,各个特殊正序后缀的特殊正序后缀位置可以是各个特殊正序后缀的后缀首字符在原始字符串中的字符位置。
在本申请实施例中,电子设备在依次将多个特殊正序后缀按照第一顺序的升序次序从临时位置链接至特殊正序后缀位置的过程中,电子设备还可以根据各个特殊正序后缀的后缀首字符生成多个特殊正序桶链表。其中,特殊正序桶链表可以是多个后缀首字符相同的特殊正序后缀链接起来形成的单链表。例如,以相同字符a开始的多个特殊正序后缀链接起来形成的单链表可以称为a的特殊正序桶链表。在生成了多个特殊正序桶链表后,电子设备可以获得各个特殊正序桶链表的开始后缀和结束后缀。在获得了多个开始后缀和结束后缀后,电子设备可以将多个特殊正序桶链表的开始后缀保存至特殊正序开始数组中,电子设备还可以将多个特殊正序桶链表的结束后缀保存至特殊正序结束数组中。
S402、调用至少N条并行线程读取所述子链表内的至少N个第二后缀,确定各个所述第二后缀的所述前继元组,并根据所述前继元组依次连接各个所述第二后缀,得到第二链表;所述N为大于2的正整数;
在本申请实施例中,电子设备在生成第一链表后,可以基于第一链表生成多个子链表。电子设备在生成多个子链表后,可以同时调用至少N条并行线程,并通过多条并行线程同时读取子链表中的至少N个第二后缀。电子设备在通过并行线程同时读取到子链表中的至少N个第二后缀后,电子设备可以同时调用至少N条并行线程,基于至少N个第二后缀对应的后缀位置,电子设备可以同时确定至少N个第二后缀对应的前继元组。电子设备在确定多个第二后缀对应的前继元组后,电子设备可以根据前继元组依次连接各个第二后缀,并生成第二链表。其中,所述N为大于2的正整数。
在本申请实施例中,电子设备在调用至少N条并行线程读取子链表内的至少N个第二后缀之前,可以通过遍历第一链表的方式,根据第一链表中的各个后缀的后缀首字符将第一链表切分为多个不同的桶链表。电子设备在生成多个桶链表后,可以确定各个桶链表对应的桶开始后缀和桶结束后缀。电子设备可以将多个桶开始后缀写入桶开始数组中,还可以将多个桶结束后缀写入桶结束数组中。电子设备还可以确定各个桶链表的开始指针和结束指针。其中开始指针用于指向桶链表的开始后缀,结束指针可以用于指向桶链表的结束后缀。电子设备可以将多个开始指针写入桶开始指针数组中,还可以将多个结束指针写入桶结束指针数组中。其中,桶链表可以是后缀类型相同且后缀首字符相同的多个后缀链接起来形成的单链表。在本申请实施例中,桶链表可以包括特殊正序桶链表、正序桶链表和逆序桶链表。因此,电子设备可以根据后缀首字符对第一链表进行切分,从而得到多个逆序桶链表和多个正序桶链表。
其中,逆序桶链表可以是多个后缀首字符相同的逆序后缀链接起来形成的单链表。正序桶链表可以是多个后缀首字符相同的正序后缀链接起来形成的单链表。电子设备在生成多个逆序桶链表后,可以获得各个逆序桶链表的桶开始后缀和桶结束后缀。在获得了逆序桶链表的多个桶开始后缀和桶结束后缀后,电子设备可以将多个逆序桶链表的桶开始后缀保存至逆序桶开始数组中,电子设备还可以将多个逆序桶链表的桶结束后缀保存至逆序桶结束数组中。电子设备在生成多个正序桶链表后,可以获得各个正序桶链表的桶开始后缀和桶结束后缀。在获得了正序桶链表的多个桶开始后缀和桶结束后缀后,电子设备可以将多个正序桶链表的桶开始后缀保存至正序桶开始数组中,电子设备还可以将多个正序桶链表的桶结束后缀保存至正序桶结束数组中。
在本实施例中,电子设备在生成多个正序桶链表和多个逆序桶链表后,还可以根据预先设定的子链表长度,对多个正序桶链表和多个逆序桶链表进行切分。因此,电子设备可以将多个正序桶链表和多个逆序桶链表划分为多个长度固定的子链表。电子设备在生成多个子链表后,可以以子链表为单位进行归纳排序。电子设备在以子链表为单位进行归纳排序时,可以同时调用多个不同的并行线程对不同的子链表执行不同归纳排序操作。在使用并行线程对子链表进行归纳排序之前,电子设备可以根据预先设定的段长度,将任一子链表切分为多个后缀段。段中可以包含多个第二后缀。其中,各个后缀段的段长度可以短于各个子链表的子链表长度。电子设备在将子链表切分为多个后缀段之后,可以确定各个后缀段对应的起始后缀。电子设备在确定了各个后缀段对应的起始后缀之后,可以将多个后缀段的起始后缀写入辅助数组中。辅助数组中可以存储着多个不同的后缀段的起始后缀。因此,在任一组并行线程中,可以包括多个并行的子线程。电子设备在通过并行线程对任一子链表进行归纳排序操作时,可以是并行线程中的多个子线程可以同时对该子链表的多个后缀段进行该归纳排序操作。
在本申请实施例中,电子设备可以通过三种线程同时对多个不同的子链表进行归纳排序。其中,三种线程分别是读取线程、归纳线程和链接线程,读取线程和链接线程可以由多个子线程并行执行,归纳线程可以为单个线程串行执行。在电子设备中,三种线程可以分别处理三个不同的子链表,因此三种线程可以组成一个并行执行的三级流水线。对于任一子链表,电子设备可以依次通过读取线程、归纳线程和链接线程来对其进行归纳排序。
在本申请实施例中,如图5所示,S402中还可以包括S4021-S4023。需要说明的是,若在S401中生成的第一链表为特殊正序链表时,第二链表为逆序链表,在本实施例中对特殊正序链表生成逆序链表可以采用S4021-S4023的方式实现;若在S401中生成的第一链表为逆序链表时,第二链表则为正序链表,在本实施例中对逆序链表生成正序链表可以采用S4021-S4023的方式实现,具体描述如下:
S4021、调用所述读取线程从所述原始字符串中获取第K条子链表中的各个所述第二后缀相应的多个前继后缀,基于多个所述前继后缀生成多个第一前继元组,并将多个所述第一前继元组写入第一读数组中;所述前继后缀为后缀首字符为所述第二后缀的前继字符的后缀;当所述第K条子链表进入归纳线程时,所述第一前继元组用于计算所述第一前继元组对应的所述第二后缀的链接位置;
在本申请实施例中,电子设备在将第一链表切分为多个子链表后,可以调用读取线程从原始字符串中读取第K条子链表中的各个第二后缀相应的前继后缀。电子设备在读取到多个前继后缀后,可以根据多个前继后缀生成第一前继数组。当第K条子链表进入归纳线程时,第一前继元组可以用于计算第一前继元组对应的第二后缀的链接位置。当第K条子链表进入归纳线程时,电子设备可以通过第一读数组中的多个第一前继元组对第K条子链表中的各个第二后缀进行归纳。
在本申请实施例中,读取线程可以包含多个预读子线程,电子设备可以将多个后缀段平均分配给多个预读子线程进行并行读取。通过多个并行的预读子线程,电子设备可以从辅助数组中同时确定多个后缀段的起始后缀。其中,辅助数组中可以存储着多个不同的后缀段的起始后缀。电子设备在确定多个起始后缀后,可以根据多个起始后缀,通过多个并行的预读子线程,同时遍历多个后缀段。在遍历多个后缀段的过程中,电子设备可以同时调用多个读取子线程确定读取子线程分配的后缀段内各个所述第二后缀的前继后缀。其中,前继后缀是根据所述第二后缀在原始字符串中的位置确定的。本申请实施例中关于前继后缀的说明请参见说明书中名词说明部分的内容,在此不再赘述。
其中,一个预读子线程可以根据一个起始后缀遍历该起始后缀对应的后缀段。在通过预读子线程遍历后缀段的过程中,电子设备可以依次确认段中各个第二后缀对应的前继后缀,并依次从原始字符串中获取各个第二后缀对应的前继后缀。电子设备在获取到前继后缀后,可以根据前继后缀生成第一前继元组,并将第一前继元组保存至读缓存数组中。在本申请实施例中,第一前继元组可以包括前继后缀的后缀首字符和该前继后缀在原始字符串中的后缀位置,即第一前继元组可以由前继字符和前继位置组成。其中,前继位置为该前继后缀在原始字符串中的后缀位置,前继字符为该前继后缀的后缀首字符。
需要说明的是,在本申请实施例中,由于子链表的子链表长度与读缓存数组的容量的相同。因此,子链表中的多个第二后缀按照字典序升序或降序的顺序被电子设备访问时,生成的前继元组在读缓存数组中的偏移量是唯一的,所以多个并行的读取子线程之间不存在存取冲突,它们可以安全地并行执行各自的读取任务。
在本申请实施例中,电子设备可以通过读取线程中的多个并行的读取子线程,同时读取多个后缀段中的第二后缀的前继后缀。因此通过本申请实施例提供的方法生成后缀链表,可以避免在读取线程中,因为串行读取而造成的大量的时间开销。因此通过本申请实施例提供的方法,电子设备可以提高前继后缀的读取效率,进而提高后缀链表的生成速度。
S4022、同时,调用归纳线程从第二读数组中读取第K-1条子链表对应的多个第二前继元组,并基于多个所述第二前继元组计算各个第二前继元组相应的链接位置,基于所述链接位置生成第一链接元组,将多个所述第一链接元组写入第一写数组中;当所述第K-1条子链表进入链接线程时,所述第一链接元组用于对所述第一链接元组对应的各个所述第二后缀进行链接;
在本申请实施例中,电子设备在通过读取线程对第K条子链表进行读取操作的同时,还可以调用归纳线程从第二读数组中读取第K-1条子链表对应的多个第二前继元组。电子设备在读取到多个第二前继元组后,可以基于前继元组,依次计算第K-1条子链表中的各个第二后缀对应的第二前继元组中的前继字符的链接位置。电子设备在计算出各个第二后缀对应的第二前继元组中的前继字符的链接位置后,可以基于链接位置生成第一链接元组,并将第K条子链表对应的多个第一链接元组写入第一写数组中进行保存。当第K-1条子链表进入链接线程时,电子设备可以通过第一链接元组对第K-1条子链表中的各个第二后缀进行链接。
在本申请实施例中,在归纳线程中,由于归纳操作只能串行执行,因此归纳线程中没有子线程。电子设备可以通过调用归纳线程依次读取读缓存数组中的多个前继后缀。电子设备可以根据前继字符的后缀首字符和辅助数组中的多个段的起始后缀,依次计算各个前继字符的链接位置。电子设备在确定前继字符的链接位置后,可以将前继字符及其对应的链接位置写入写缓存数组中进行保存。
在本申请实施例中,电子设备可以调用归纳线程依次读取第二读数组中的多个第二前继元组。由于第二前继元组可以由前继字符和前继位置组成,因此电子设备可以根据第二前继元组中保存的前继首字符确定第二前继元组对应的前继后缀所属的桶链表。电子设备在确定前继后缀所属的桶链表后,可以根据桶结束指针数组确定该桶链表的结束指针。根据前继后缀所属的桶链表的结束指针,电子设备可以计算前继字符的链接位置。其中,结束指针可以用于指向前继后缀所属的桶链表的结束后缀。由于电子设备在生成第一链表后,可以基于第一链表生成多个桶链表,并根据预先设定的子链表长度,对多个正序桶链表和多个逆序桶链表进行切分生成多个子链表。其中,电子设备生成的各个子链表中,可以包括唯一的子链表编号。通过子链表编号,电子设备可以确定唯一对应的子链表。因此,电子设备在确定前继字符的链接位置后,可以根据链接位置确定前继后缀所属的子链表的子链表编号。电子设备可以根据链接位置和子链表编号生成第一链接元组。其中,第一链接元组中,可以包括前继位置、前继字符的链接位置和前继后缀所属的子链表的子链表编号。电子设备在生成多个第一链接元组后,可以将多个第一链接元组写入第一写数组中进行保存。其中,在第K-1条子链表进入链接阶段时,电子设备可以根据第一链接元组对第K-1条子链表的各个第二后缀进行链接。
在本申请实施例中,由于生成第二链表的过程本质是从有序后缀推到无序后缀的过程,因此在此过程中可能出现数据依赖问题。即当第二后缀对应的前继后缀未被归纳排序成为有序后缀时,电子设备无法根据前继后缀对第二后缀进行归纳排序。当出现数据依赖问题时,电子设备在读取阶段便无法读取到第二后缀的前继后缀。因此电子设备在确定前继后缀所属的子链表的子链表编号之后,可以通过判断前继元组中是否包含前继后缀的后缀首字符,即电子设备可以判断前继元组中是否包含前继字符。若前继元组中不包含前继后缀的后缀首字符,则可以认为电子设备在上一个执行周期的读取阶段中没有读取到前继字符,则电子设备可以从原始字符串中获取前继后缀的后缀首字符,并将读取到的前继后缀的后缀首字符写入第二写数组中的相应位置进行保存。若前继元组中包含前继后缀的后缀首字符,则电子设备可以基于子链表编号和链接位置生成第一链接元组,并将第一链接元组写入第一写数组中进行保存。
在本申请实施例中,由于电子设备可以在确定前继字符所属的子链表的子链表编号之后,判断前继元组是否包含前继后缀的后缀首字符。若前继元组包含前继后缀的后缀首字符,电子设备则可以从原始字符串中获取相应的前继字符。因此本申请实施例提供的方法可以有效避免因出现数据依赖而导致无法生成正确的后缀链表的问题。因此本申请实施例提供的方法可以保证生成的后缀链表的正确性以及并行归纳排序过程的有效进行。
S4023、同时,调用所述链接线程从第二写数组中依次读取第K-2条子链表对应的多个第二链接元组,根据所述第二链接元组确定各个所述第二后缀的链接位置,并基于所述链接位置对所述第二后缀进行链接以生成所述第二链表。
在本申请实施例中,电子设备在通过读取线程对第K条子链表进行读取操作并且调用归纳线程从第二读数组中读取第K-1条子链表对应的多个第二前继元组的同时,还可以调用链接线程从第二写数组中依次读取第K-2条子链表对应的多个第二链接元组。电子设备可以根据第二链接元组,确定第K-2条子链表中多个第二后缀对应的前继后缀的链接位置。电子设备可以根据各个第二后缀对应的前继后缀的链接位置,将第二后缀链接到链接位置上。
在本申请实施例中,在链接线程中,由于每个前继后缀在第二链表中的链接位置是唯一的,因此链接操作可以并行执行,因此链接线程中可以包括多个链接子线程。电子设备可以同时调用至少N个并行的链接子线程。通过至少N个并行的链接子线程,电子设备可以同时从写缓存数组中读取至少N个前继后缀和至少N个前继后缀对应的链接位置。电子设备可以通过至少N个并行的链接子线程根据链接位置对至少N个第二后缀进行链接。其中,N为大于2的正整数。
在本申请实施例中,在链接线程,电子设备可以同时调用多条链接子线程,并将多个后缀段平均分配给多个链接子线程。通过多个并行的链接子线程,电子设备可以从第二写数组中同时获取多个链接子线程分配的后缀段中的第二后缀对应的第二链接元组。电子设备在获取到多个第二链接元组后,可以同时调用多个链接子线程根据多个第二链接元组确定多个前继位置、链接位置和子链表编号。电子设备可以同时调用多个链接子线程根据多个第二链接元组中的前继位置、链接位置和子链表编号对多个第二后缀进行链接。
在本申请实施例中,由于生成第二链表的过程本质是从有序后缀推到无序后缀的过程,因此在此过程中可能出现数据依赖问题。即当第二后缀对应的前继后缀未被归纳排序成为有序后缀时,电子设备无法根据前继后缀对第二后缀进行归纳排序。当出现数据依赖问题时,电子设备在读取和归纳阶段便无法读取到第二后缀的前继后缀。因此电子设备在将第二后缀链接至链接位置后,可以判断第二链接数组中的子链表编号与电子设备当前正在连接的子链表对应的子链表编号是否相同。例如,若电子设备正通过链接线程对第K-2条子链表执行链接操作,则电子设备可以判断第二链接数组中的子链表编号是否等于K-2。若第二链接数组中的子链表编号与电子设备当前正在连接的子链表对应的子链表编号相同,则可以认为第二后缀对应的前继后缀属于当前正在链接的子链表,即前继后缀还未链接到其所属的子链表中,因此电子设备无法基于该前继后缀对该前继后缀对应的第二后缀进行排序。此时,电子设备可以从原始字符串中读取第二链接数组对应的前继后缀,并将读取到的前继后缀保存至当前正处于归纳线程的第一读数组中,以供后续的归纳线程使用。若第二链接数组中的子链表编号与电子设备当前正在连接的子链表对应的子链表编号不相同,则电子设备可以继续执行下一链接操作。
在本申请实施例中,由于电子设备在生成关于第二后缀的第二链表的过程中,可以通过三种线程以流水线的方式同时对三条不同的子链表执行不同的归纳排序工作,因此通过本申请实施例提供的方法生成第二链表可以减少归纳排序过程中因为随机读写前继后缀而造成的大量的时间开销。因此本申请实施例提供的方法可以显著提高了电子设备生成后缀链表的速度。
在本申请实施例中,电子设备中可以包含一个工作数组A。其中,工作数组A可以是一个长度为n+1的整型数组,工作数组A中的各个位置可以用于保存多种后缀类型的后缀,当工作数组A用于保存后缀链表时,任一位置上保存后缀的后缀类型可以与原始字符串中相同位置上后缀的后缀类型相同。n可以为原始字符串的长度。例如:当原始字符串的某一后缀suf(X, i)为逆序后缀,则工作数组A中第i个位置中保存的后缀也可以是逆序后缀。X可以为原始字符串,i可以表示后缀在原始字符串中的位置,i∈[1,n]。在本申请实施例中,生成第二链表可以通过复用工作数组的方式实现。通过复用工作数组基于第一链表生成第二链表的具体步骤如下所述:
在一种可能的实现方式中,上述第一链表包括但不限于:特殊正序链表和逆序链表。同样,上述第二链表包括但不限于:逆序链表和正序链表。
根据第一链表和第二链表的不同,上述通过复用工作数组基于第一链表生成第二链表的生成方法中,第一链表和第二链表存在两种配对情况。一般情况下,电子设备先执行情况1中两种类型链表的生成流程,然后再执行情况2中另外两种类型链表的生成流程:
情况1:第一链表为特殊正序链表,第二链表为逆序链表;
电子设备在生成特殊正序链表后,可以通过遍历第一链表的方式获得多个桶链表,其中桶链表可以包括逆序桶链表和正序桶链表。其中,逆序桶链表可以是由多个后缀首字符相同的逆序后缀链接而成的单链表。电子设备在生成多个逆序桶链表之后可以确定各个逆序桶链表的桶开始后缀和桶结束后缀。电子设备可以将多个逆序桶链表的桶开始后缀写入逆序桶开始数组中,还可以将多个逆序桶链表的桶结束后缀写入逆序桶结束数组中。正序桶链表可以是由多个后缀首字符相同的正序后缀链接而成的单链表。电子设备在生成多个正序桶链表之后可以确定各个正序桶链表的桶开始后缀和桶结束后缀。电子设备可以将多个正序桶链表的桶开始后缀写入正序桶开始数组中,还可以将多个正序桶链表的桶结束后缀写入正序桶结束数组中。
电子设备在生成逆序桶开始数组、逆序桶结束数组、正序桶开始数组和正序桶结束数组后,可以按照后缀首字符的字典序升序的顺序依次遍历各个字符桶链表。其中,字符桶链表的并行归纳排序方式可以参见上述实施例中S4021-S4023的相关描述,在此不再赘述。
在本实施例中,电子设备对于后缀首字符相同的后缀桶链表,可以先根据逆序桶开始数组和逆序桶结束数组遍历多个升序逆序桶链表ψL(c)。其中c可以为桶链表的后缀首字符。然后电子设备可以根据正序桶开始数组和结束数组遍历特殊正序升序桶链表ψS*(c)。假设当前正在遍历的后缀为suf(X,ψ[i]),如果后缀suf(X,ψ[i])的前继后缀suf(X,ψ[i]-1)为逆序后缀,则电子设备可以将该前继后缀suf(X,ψ[i]-1)链接至其所属的桶链表的结束后缀。然后电子设备可以更新前继后缀suf(X,ψ[i]-1)所属的桶链表的结束指针。电子设备可以通过执行ψL[LBe[X[ψ[i]-1]]]=ψ[i]-1的方式将前继后缀suf(X,ψ[i]-1)链接至其所属的桶链表的结束后缀。电子设备还可以通过执行LBe[X[ψ[i]-1]]=ψ[i]-1的方式更新前继后缀suf(X,ψ[i]-1)所属的桶链表的结束指针。遍历过程结束后,电子设备可以根据各个桶链表的桶开始数组和桶结束数组,将多个逆序桶链表的按照字典序升序链接至相应的后缀位置上,以形成升序逆序链表ψL。
电子设备在形成升序逆序链表ψL后,可以通过遍历升序逆序链表ψL的方式,将多个逆序后缀按照字典序降序链接起来,生成降序逆序链表φL。遍历过程中,电子设备可以根据后缀首字符的不同,更新逆序桶开始数组和逆序桶结束数组。
情况2:第一链表为逆序链表,第二链表为正序链表;
电子设备可以基于降序逆序链表φL生成逆序桶开始数组、逆序桶结束数组、正序桶开始数组和正序桶结束数组。其中,电子设备生成多个数据的具体过程与情况1中的内容相同,可以参见情况1中的描述,在此不再赘述。
电子设备在生成逆序桶开始数组、逆序桶结束数组、正序桶开始数组和正序桶结束数组后,可以按照后缀首字符降序遍历各个字符桶链表。其中,字符桶链表的并行归纳排序方式可以参见上述实施例中S4021-S4023的相关描述,在此不再赘述。
在本实施例中,对于后缀首字符相同的后缀桶链表,电子设备可以先根据正序桶开始数组和正序桶结束数组遍历多个正序桶链表φS(c)。其中c可以为桶链表的后缀首字符。然后电子设备可以根据逆序桶开始数组和逆序桶结束数组遍历降序逆序链表φL。假设当前正在遍历的后缀为suf(X,φ[i]),如果后缀suf(X,φ[i])的前继后缀suf(X,φ[i]-1)为正序后缀,则电子设备可以将该前继后缀suf(X,φ[i]-1)链接至其所属的桶链表的结束后缀。然后电子设备可以更新前继后缀suf(X,φ[i]-1)所属的桶链表的结束指针。电子设备可以通过执行ψS[SBe[X[φ[i]-1]]]=φ[i]-1的方式将前继后缀suf(X,φ[i]-1)链接至其所属的桶链表的结束后缀。电子设备还可以通过执行SBe[X[φ[i]-1]]=φ[i]-1的方式更新前继后缀suf(X,φ[i]-1)所属的桶链表的结束指针。遍历过程结束后,电子设备可以根据各个桶链表的桶开始数组和桶结束数组,将多个正序桶链表的按照字典序降序链接至相应的后缀位置上,以形成降序正序链表φS。
电子设备在形成降序正序链表φS后,可以通过遍历降序正序链表φS的方式,将多个正序后缀按照字典序升序链接起来,生成升序正序链表ψS。遍历过程中,电子设备可以根据后缀首字符的不同,更新正序桶开始数组和正序桶结束数组。
在本申请实施例中,由于电子设备可以通过复用工作数组A的方式对多个第二后缀进行归纳排序并生成第二链表,因此本申请实施例提供的链表生成方法可以有效节省生成后缀链表需要的内存空间。
如图6所示,为本申请实施例提供的一种流水线并行执行的三种线程执行顺序示意图。
图6为电子设备通过流水线的方式执行三种线程的执行顺序,纵轴可以表示多个子链表,其中Lk可以表示第k条子链表,横轴可以表示时间。正方形可以表示并行节点,并行节点可以包括预读节点和链接节点。并行节点中可以包括多个并行的子线程,多个并行的子线程可以同时对子链表中的多个后缀段进行并行操作。例如,某一预读节点为并行节点,则该预读节点中可以包括多个并行的预读子线程。电子设备可以将子链表中的多个后缀段平均地分配给多个预读子线程。多个预读子线程可以同时对多个后缀段进行预读操作。圆形可以表示串行节点。在本实施例中,串行节点可以包括归纳节点。在串行节点中,电子设备可以依次对子链表中的第二后缀进行节点操作。例如在归纳节点中,电子设备可以依次对子链表中的各个第二后缀执行归纳操作。虚线框中,为电子设备在某一执行周期内对连续的三个子链表分别并行执行的三种不同的归纳排序操作。此时,电子设备正通过预读线程正在处理子链表Lk+1。电子设备可以同时通过多个预读子线程读取子链表Lk+1的多个前继后缀,并将读取到的前继后缀保存至第一读缓冲数组R1中,以供下一个执行周期中的归纳阶段使用。同时,电子设备还通过归纳线程处理子链表Lk。在归纳线程中,电子设备可以遍历上一个执行周期的预读阶段提供的第二读缓存数组R2。在归纳线程中,电子设备可以通过遍历第二读缓存数组,推导子链表Lk中的各个第二后缀对应的前继后缀的顺序。在确定子链表Lk的多个前继后缀和各个前继后缀对应的顺序后,电子设备可以将多个前继后缀和各个前继后缀对应的顺序保存至第一写缓存数组W1中,为下一个执行周期的链接阶段做准备。在虚线框的链接阶段中,电子设备正在处理子链表Lk-1。电子设备可以使用多个并行的链接子线程同时读取上一个执行周期的归纳阶段提供的第二写缓存数组W2。电子设备可以通过多个并行的链接子线程将第二写缓存数组中的多个前继后缀链接至目标位置。各桶链表中的子链表可以按照编号升序依次被电子设备通过流水线的方式执行归纳排序操作,直到整个归纳排序过程结束。在归纳排序的过程中,电子设备可以根据归纳排序的结果将多个逆序桶链表的开始后缀和结束后缀写入逆序桶数组中进行保存。电子设备还可以根据归纳排序的结果将多个正序桶链表的开始后缀和结束后缀写入正序桶数组中进行保存。最后,电子设备可以根据逆序桶数组和正序桶数组,将多个第二后缀按照字典序升序或降序链接起来,并生成最终的后缀链表或后缀索引。
如图7所示,为通过流水线的方式并行执行的三种线程时,两个执行周期的体系结构图。
图7中,X可以表示原始字符串,H可以表示辅助数组,辅助数组中可以存储着多个不同的后缀段的起始后缀。LB可以表示逆序辅助数组,逆序辅助数组中可以保存着多个逆序桶链表的首尾信息,如逆序桶链表的开始指针和结束指针。SB可以表示正序辅助数组,正序辅助数组中可以保存着多个正序桶链表的首尾信息,如正序桶链表的开始指针和结束指针。A可以表示工作数组,电子设备可以通过复用工作数组A的方式生成第二链表。即,电子设备可以在预读线程中从工作数组A中读取前继后缀。在链接阶段中,电子设备可以将第二后缀链接至工作数组A对应的链接位置中。读数组R可以包括第一读数组R1和第二读数组R2。在本申请实施例中,电子设备在预读线程和归纳线程中可以交替使用第一读数组R1和第二读数组R2。写数组W可以包括第一写数组W1和第二写数组W2。在本申请实施例中,电子设备在归纳线程和链接线程中可以交替使用第一写数组W1和第二写数组W2。电子设备通过交替使用第一读数组R1和第二读数组R2以及第一写数组W1和第二写数组W2以避免相邻两个阶段之间出现存取冲突。为了能有足够的空间保存子链表中所有第二后缀的对应的前继信息,写数组W和读数组R的大小可以与子链表的子链表长度相同。读数组R中可以保存多个前继元组,任一前继元组可以为一个二元组<chr, pos>。其中chr可以表示前继后缀的后缀首字符,即前继字符,pos可以表示前继后缀的后缀位置。写数组W中可以保存多个链接元组,任一链接元组可以是一个三元组<pos1, pos2, idx>,其中,pos1可以表示前继后缀的后缀位置,pos2可以表示前继后缀对应的链接位置,idx可以表示前继后缀所属的子链表的子链表编号。电子设备在链接阶段可以根据链接元组执行A[pos2]=pos1的操作,把第二后缀链接到子链表编号为Lidx的子链表中的位置pos2。
如图7(a)所示,电子设备正通过流水线的方式执行某个执行周期。虚线框中电子设备在三个不同的子链表上并行运行的三种线程。在该执行周期中,电子设备正通过读取线程在对子链表LK+1执行并行读取的操作。与此同时,电子设备正通过归纳线程在对子链表LK执行串行归纳的操作。与此同时,电子设备正通过链接线程在对子链表LK-1执行并行链接的操作。多个子链表可以按照编号升序被三种线程依次访问。在图7(a)的预读阶段电子设备可以将子链表LK+1对应的多个前继元组写入第二读数组R2中。在归纳阶段,电子设备可以从第一读数组R1中读取子链表LK对应的多个前继元组,并根据读取到的前继元组生成链接元组。电子设备可以将子链表LK对应的多个链接元组写入第一写数组W1中进行保存。在链接阶段,电子设备可以从第二写数组W2中获取子链表LK-1对应的多个链接元组,并基于获取到的链接元组对子链表LK-1中的多个第二后缀进行链接。
如图7(b)所示,电子设备正通过流水线的方式执行某个执行周期。虚线框中电子设备在三个不同的子链表上并行运行的三种线程。在该执行周期中,电子设备正通过读取线程在对子链表LK+2执行并行读取的操作。与此同时,电子设备正通过归纳线程在对子链表LK+1执行串行归纳的操作。与此同时,电子设备正通过链接线程在对子链表LK执行并行链接的操作。子链表可以按照编号升序依次被三种线程访问。在图7(b)的预读阶段电子设备可以从工作数组A中获取子链表LK+2对应的多个前继后缀。基于多个前继后缀电子设备可以生成多个前继元组,并将子链表LK+2对应的多个前继元组写入第一读数组R1中。在归纳阶段,电子设备可以从第二读数组R2中读取子链表LK+1对应的多个前继元组,并根据读取到的前继元组生成链接元组。电子设备可以将子链表LK+1对应的多个链接元组写入第二写数组W2中进行保存。在链接阶段,电子设备可以从第一写数组W1中获取子链表LK对应的多个链接元组,并基于获取到的链接元组对子链表LK中的多个第二后缀进行链接。
在本申请实施例中,第一后缀可以包括特殊正序后缀和逆序后缀。第一类型可以包括特殊正序类型和逆序类型。第一链表可以包括特殊正序链表和逆序链表。第二后缀可以包括正序后缀和逆序后缀。第二类型可以包括正序类型和逆序类型。第二链表可以包括正序链表和逆序链表。其中本申请实施例中,关于多种字符类型、多种后缀链表和多种后缀的说明请参见说明书名词说明部分的内容,在此不再赘述。
在本申请实施例中,为了利用有限的内存空间快速计算后缀单链表,本申请实施例提供了一种基于链式结构并行归纳排序方法来加速第二后缀的排序过程。该方法将排序过程组织成一个三级流水线并行执行,通过减少归纳排序过程中随机读写前继后缀的时间开销,来提高了计算速度。且通过本申请实施例提供的方法构造后缀链表,构造后缀链表需要的内存空间没有明显增加。在实际应用中,可以采用本实施例提供的方法,在多核计算机和并行随机读写模型上,快速计算给定输入字符串的链式后缀链表。
S403、根据所述第二链表生成后缀链表。
在本申请实施例中,电子设备在生成多个第二链表之后,可以通过遍历第二链表的方式,将多个第二链表中的第二后缀按字典序链接起来,以生成后缀链表。
在一种可能实现方式中,第二链表可以包括降序正序链表和降序逆序链表。当电子设备生成降序正序链表和降序逆序链表时,电子设备可以通过遍历降序正序链表的方式,将降序正序链表中的多个正序后缀按字典序升序链接起来,以生成升序正序链表。电子设备还可以基于升序正序链表的开始指针生成正序开始数组。电子设备可以基于升序正序链表的结束指针生成正序结束数组。电子设备还可以通过遍历降序逆序链表的方式,将降序逆序链表中的多个逆序后缀按字典序升序链接起来,以生成升序逆序链表。电子设备还可以基于升序正序链表的开始指针生成逆序开始数组。电子设备可以基于升序正序链表的结束指针生成逆序结束数组。生成升序正序链表和升序逆序链表后,电子设备可以根据正序开始数组、正序结束数组、逆序开始数组和逆序结束数组将正序链表和升序逆序链表中的多个正序后缀和逆序后缀按字典序升序链接起来,并生成升序后缀链表。
针对任一长度为n字符串X(n≤232),本申请实施例可在多核计算机上,利用多核计算机的并行计算能力,实现基于链式结构后缀索引的快速计算。通过本申请实施例提供的方法生成后缀链表,需要的内存空间约为4n字节,即工作数组A的空间。本实施例针对现有技术中后缀链表串行归纳排序过程中大量随机读写导致的计算速度较慢的问题,将后缀链表按照字典序分为多个固定长度的子链表,使用基于单链表的并行归纳排序方法依次对各个子链表进行排序。最后本实施例将各子链表的首尾链接起来形成最终的链式后缀链表。本实施例中,基于链式结构的并行归纳排序由三级流水线组成,包括预读线程、归纳线程和链接线程。在预读线程和链接线程中,还可以使用多个子线程并行执行来减小随机读写需要的时间开销。三种线程流水式并行执行,明显加速了对第二后缀的归纳排序过程,而实现流水线需要内存空间相比于现有技术没有明显增加。本实施例申请的链式结构后缀索引计算方法解决了现有方法中时间或空间性能不平衡的问题,计算速度快同时保持了最优的内存空间开销。在计算LZ77因子分解的实际应用环境中,针对输入字符串长度大而内存空间有限的情形,便可以采用本实施例提出链表生成方法构造后缀链表。
需要说明的是,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
参照图8,示出了本申请实施例提供的一种链表的生成装置的示意图,具体可以包括第一链表生成模块801、第二链表生成模块802和后缀链表生成模块803,其中:
第一链表生成模块801,用于根据原始字符串中各个第一后缀的后缀位置生成第一链表,并根据所述第一链表生成多个子链表;所述子链表包括多个第二后缀;所述第二后缀为所述原始字符串中字符类型为与第一类型不同的字符对应的后缀;所述第一链表中包括多个存储在后缀位置的第一后缀;所述第一后缀为所述原始字符串中字符类型为第一类型的字符对应的后缀;所述第一链表是由多个第一后缀基于所述第一后缀的字典顺序链接而成;所述后缀位置由所述后缀的后缀首字符在原始字符串中的位置确定;
第二链表生成模块802,用于调用至少N条并行线程读取所述子链表内的至少N个第二后缀,确定各个所述第二后缀的所述前继元组,并根据所述前继元组依次连接各个所述第二后缀,得到第二链表;所述N为大于2的正整数;
后缀链表生成模块803,用于根据所述第二链表生成后缀链表。
其中,第二链表生成模块802,还可以用于调用所述读取线程从所述原始字符串中获取第K条子链表中的各个所述第二后缀相应的多个前继后缀,基于多个所述前继后缀生成多个第一前继元组,并将多个所述第一前继元组写入第一读数组中;所述前继后缀为后缀首字符为所述第二后缀的前继字符的后缀;当所述第K条子链表进入归纳线程时,所述第一前继元组用于计算所述第一前继元组对应的所述第二后缀的链接位置;同时,调用归纳线程从第二读数组中读取第K-1条子链表对应的多个第二前继元组,并基于多个所述第二前继元组计算各个第二前继元组相应的链接位置,基于所述链接位置生成第一链接元组,将多个所述第一链接元组写入第一写数组中;当所述第K-1条子链表进入链接线程时,所述第一链接元组用于对所述第一链接元组对应的各个所述第二后缀进行链接;同时,调用所述链接线程从第二写数组中依次读取第K-2条子链表对应的多个第二链接元组,根据所述第二链接元组确定各个所述第二后缀的链接位置,并基于所述链接位置对所述第二后缀进行链接以生成所述第二链表。
第二链表生成模块802,还可以用于将所述多个后缀段平均分配给所述多个读取子线程;同时调用多个所述读取子线程确定所述读取子线程分配的后缀段内各个所述第二后缀的前继后缀;所述前继后缀是根据所述第二后缀在所述原始字符串中的位置确定的。
第二链表生成模块802,还可以用于调用所述归纳线程依次读取所述第二读数组中的多个所述第二前继元组;基于所述第二前继元组中的所述前继字符,确定所述前继字符所属的所述桶链表;根据所述前继字符所属的桶链表的结束指针确定所述前继字符的链接位置;所述结束指针用于指向所述桶链表的结束后缀;基于所述链接位置确定所述前继字符所属的子链表的子链表编号;基于所述链接位置和所述子链表编号生成所述第一链接元组。
第二链表生成模块802,还可以用于将所述多个后缀段平均分配给所述多个链接子线程;同时调用多个所述链接子线程从所述第二写数组中读取所述链接子线程分配的所述第二后缀对应的所述第二链接元组。
第二链表生成模块802,还可以用于判断所述前继元组中是否包含所述前继后缀的后缀首字符;若所述第二后缀对应的所述前继元组中不包括所述后缀首字符,则从所述原始字符串中获取所述后缀首字符。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述得比较简单,相关之处参见方法实施例部分的说明即可。
参照图9,示出了本申请实施例提供的一种终端设备的示意图。如图9所示,本申请实施例中的终端设备900包括:处理器910、存储器920以及存储在所述存储器920中并可在所述处理器910上运行的计算机程序921。所述处理器910执行所述计算机程序921时实现上述链表的生成方法各个实施例中的步骤,例如图4所示的步骤S401至S403。或者,所述处理器910执行所述计算机程序921时实现上述各装置实施例中各模块/单元的功能,例如图8所示模块801至803的功能。
示例性的,所述计算机程序921可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器920中,并由所述处理器910执行,以完成本申请。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段可以用于描述所述计算机程序921在所述终端设备900中的执行过程。例如,所述计算机程序921可以被分割成第一链表生成模块、第二链表生成模块和后缀链表生成模块,各模块具体功能如下:
第一链表生成模块,用于根据原始字符串中各个第一后缀的后缀位置生成第一链表,并根据所述第一链表生成多个子链表;所述子链表包括多个第二后缀;所述第二后缀为所述原始字符串中字符类型为与第一类型不同的字符对应的后缀;所述第一链表中包括多个存储在后缀位置的第一后缀;所述第一后缀为所述原始字符串中字符类型为第一类型的字符对应的后缀;所述第一链表是由多个第一后缀基于所述第一后缀的字典顺序链接而成;所述后缀位置由所述后缀的后缀首字符在原始字符串中的位置确定;
第二链表生成模块,用于调用至少N条并行线程读取所述子链表内的至少N个第二后缀,确定各个所述第二后缀的所述前继元组,并根据所述前继元组依次连接各个所述第二后缀,得到第二链表;所述N为大于2的正整数;
后缀链表生成模块,用于根据所述第二链表生成后缀链表。
所述终端设备900可以是前述各个实施例中的电子设备,该电子设备可以是桌上型计算机、云端服务器等计算设备。所述终端设备900可包括,但不仅限于,处理器910、存储器920。本领域技术人员可以理解,图9仅仅是终端设备900的一种示例,并不构成对终端设备900的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述终端设备900还可以包括输入输出设备、网络接入设备、总线等。
所述处理器910可以是中央处理单元(CentralProcessing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-ProgrammableGate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
所述存储器920可以是所述终端设备900的内部随机存储单元,例如终端设备900的内存。所述存储器920用于存储所述计算机程序921以及所述终端设备900所需的其他程序和数据。所述存储器920还可以用于暂时地存储已经输出或者将要输出的数据。
本申请实施例还公开了一种终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如前述各个实施例所述的链表的生成方法。
本申请实施例还公开了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如前述各个实施例所述的链表的生成方法。
本申请实施例还公开了一种计算机程序产品,当所述计算机程序产品在计算机上运行时,使得所述计算机执行前述各个实施例所述的链表的生成方法。
以上所述实施例仅用以说明本申请的技术方案,而非对其限制。尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围,均应包含在本申请的保护范围之内。
Claims (8)
1.一种链表的生成方法,其特征在于,包括:
根据原始字符串中各个第一后缀的后缀位置生成第一链表,并根据所述第一链表生成多个子链表;所述子链表包括多个第二后缀;所述第二后缀为所述原始字符串中字符类型为与第一类型不同的字符对应的后缀;所述第一链表中包括多个存储在后缀位置的第一后缀;所述第一后缀为所述原始字符串中字符类型为第一类型的字符对应的后缀;所述第一链表是由多个第一后缀基于所述第一后缀的字典顺序链接而成;所述后缀位置由所述后缀的后缀首字符在原始字符串中的位置确定;
调用至少N条并行线程读取所述子链表内的至少N个第二后缀,确定各个所述第二后缀的前继元组,并根据所述前继元组依次连接各个所述第二后缀,得到第二链表;所述N为大于2的正整数;
根据所述第二链表生成后缀链表;
所述多个子链表至少包括K条子链表,所述K为大于或等于3的正整数,所述至少N条并行线程中包含有至少一对并行线程对;所述并行线程对内包含读取线程以及链接线程;所述读取线程的执行时序早于所述链接线程的执行时序;所述调用至少N条并行线程读取所述子链表内的至少N个第二后缀,确定各个所述第二后缀的所述前继元组,并根据所述前继元组依次连接各个所述第二后缀,得到第二链表,包括:
调用所述读取线程从所述原始字符串中获取第K条子链表中的各个所述第二后缀相应的多个前继后缀,基于多个所述前继后缀生成多个第一前继元组,并将多个所述第一前继元组写入第一读数组中;所述前继后缀为后缀首字符为所述第二后缀的前继字符的后缀;当所述第K条子链表进入归纳线程时,所述第一前继元组用于计算所述第一前继元组对应的所述第二后缀的链接位置;
同时,调用归纳线程从第二读数组中读取第K-1条子链表对应的多个第二前继元组,并基于多个所述第二前继元组计算各个第二前继元组相应的链接位置,基于所述链接位置生成第一链接元组,将多个所述第一链接元组写入第一写数组中;当所述第K-1条子链表进入链接线程时,所述第一链接元组用于对所述第一链接元组对应的各个所述第二后缀进行链接;
同时,调用所述链接线程从第二写数组中依次读取第K-2条子链表对应的多个第二链接元组,根据所述第二链接元组确定各个所述第二后缀的链接位置,并基于所述链接位置对所述第二后缀进行链接以生成所述第二链表;
所述子链表包括多个预设长度的后缀段,所述后缀段中包括多个所述第二后缀,所述读取线程中包括多个读取子线程;所述调用所述读取线程从所述原始字符串中获取第K条子链表中的各个所述第二后缀相应的多个前继后缀,基于多个所述前继后缀生成多个第一前继元组,并将多个所述第一前继元组写入第一读数组中,包括:
将所述多个后缀段平均分配给所述多个读取子线程;
同时调用多个所述读取子线程确定所述读取子线程分配的后缀段内各个所述第二后缀的前继后缀;所述前继后缀是根据所述第二后缀在所述原始字符串中的位置确定的。
2.根据权利要求1所述的方法,其特征在于,所述子链表是根据预先设定的子链表长度对桶链表进行划分后得到的;所述桶链表是由多个所述后缀首字符相同的所述第二后缀组成的链表;
所述调用归纳线程从第二读数组中依次读取第K-1条子链表对应的多个第二前继元组,并基于多个所述第二前继元组计算各个第二前继元组相应的链接位置,基于所述链接位置生成第一链接元组,将多个所述第一链接元组写入第一写数组中,包括:
调用所述归纳线程依次读取所述第二读数组中的多个所述第二前继元组;
基于所述第二前继元组中的所述前继字符,确定所述前继字符所属的所述桶链表;
根据所述前继字符所属的桶链表的结束指针确定所述前继字符的链接位置;所述结束指针用于指向所述桶链表的结束后缀;
基于所述链接位置确定所述前继字符所属的子链表的子链表编号;
基于所述链接位置和所述子链表编号生成所述第一链接元组。
3.根据权利要求1所述的方法,其特征在于,所述子链表包括多个预设长度的后缀段,所述后缀段中包括多个所述第二后缀,所述链接线程中包括多个链接子线程;
所述调用所述链接线程从第二写数组中读取第K-2条子链表对应的多个第二链接元组,根据所述第二链接元组计算各个所述第二后缀的链接位置,并基于所述链接位置对所述第二后缀进行链接以生成所述第二链表,包括:
将所述多个后缀段平均分配给所述多个链接子线程;
同时调用多个所述链接子线程从所述第二写数组中读取所述链接子线程分配的所述第二后缀对应的所述第二链接元组。
4.根据权利要求2所述的方法,其特征在于,所述基于所述链接位置确定所述前继字符所属的子链表的子链表编号之后,包括:
判断所述前继元组中是否包含所述前继后缀的后缀首字符;
若所述第二后缀对应的所述前继元组中不包括所述后缀首字符,则从所述原始字符串中获取所述后缀首字符。
5.根据权利要求1-4任一项所述的方法,其特征在于,所述第一链表包括特殊正序链表和逆序链表;对应的所述第二链表包括逆序链表和正序链表;所述第一后缀包括特殊正序后缀和逆序后缀;对应的所述第二后缀包括逆序后缀和正序后缀;所述正序后缀的后缀首字符为正序字符;所述逆序后缀的后缀首字符为逆序字符;所述特殊正序后缀的后缀首字符为特殊正序字符;所述正序字符为字符大小大于后继字符的字符;所述逆序字符为字符大小大于或等于后继字符的字符;所述特殊正序字符为前继字符为逆序字符的正序字符。
6.一种链表的生成装置,其特征在于,包括:
第一链表生成模块,用于根据原始字符串中各个第一后缀的后缀位置生成第一链表,并根据所述第一链表生成多个子链表;所述子链表包括多个第二后缀;所述第二后缀为所述原始字符串中字符类型为与第一类型不同的字符对应的后缀;所述第一链表中包括多个存储在后缀位置的第一后缀;所述第一后缀为所述原始字符串中字符类型为第一类型的字符对应的后缀;所述第一链表是由多个第一后缀基于所述第一后缀的字典顺序链接而成;所述后缀位置由所述后缀的后缀首字符在原始字符串中的位置确定;
第二链表生成模块,用于调用至少N条并行线程读取所述子链表内的至少N个第二后缀,确定各个所述第二后缀的前继元组,并根据所述前继元组依次连接各个所述第二后缀,得到第二链表;所述N为大于2的正整数;
后缀链表生成模块,用于根据所述第二链表生成后缀链表;
所述多个子链表至少包括K条子链表,所述K为大于或等于3的正整数,所述至少N条并行线程中包含有至少一对并行线程对;所述并行线程对内包含读取线程以及链接线程;所述读取线程的执行时序早于所述链接线程的执行时序;所述调用至少N条并行线程读取所述子链表内的至少N个第二后缀,确定各个所述第二后缀的所述前继元组,并根据所述前继元组依次连接各个所述第二后缀,得到第二链表,包括:
调用所述读取线程从所述原始字符串中获取第K条子链表中的各个所述第二后缀相应的多个前继后缀,基于多个所述前继后缀生成多个第一前继元组,并将多个所述第一前继元组写入第一读数组中;所述前继后缀为后缀首字符为所述第二后缀的前继字符的后缀;当所述第K条子链表进入归纳线程时,所述第一前继元组用于计算所述第一前继元组对应的所述第二后缀的链接位置;
同时,调用归纳线程从第二读数组中读取第K-1条子链表对应的多个第二前继元组,并基于多个所述第二前继元组计算各个第二前继元组相应的链接位置,基于所述链接位置生成第一链接元组,将多个所述第一链接元组写入第一写数组中;当所述第K-1条子链表进入链接线程时,所述第一链接元组用于对所述第一链接元组对应的各个所述第二后缀进行链接;
同时,调用所述链接线程从第二写数组中依次读取第K-2条子链表对应的多个第二链接元组,根据所述第二链接元组确定各个所述第二后缀的链接位置,并基于所述链接位置对所述第二后缀进行链接以生成所述第二链表;
所述子链表包括多个预设长度的后缀段,所述后缀段中包括多个所述第二后缀,所述读取线程中包括多个读取子线程;所述调用所述读取线程从所述原始字符串中获取第K条子链表中的各个所述第二后缀相应的多个前继后缀,基于多个所述前继后缀生成多个第一前继元组,并将多个所述第一前继元组写入第一读数组中,包括:
将所述多个后缀段平均分配给所述多个读取子线程;
同时调用多个所述读取子线程确定所述读取子线程分配的后缀段内各个所述第二后缀的前继后缀;所述前继后缀是根据所述第二后缀在所述原始字符串中的位置确定的。
7.一种终端设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1-5任一项所述的链表的生成方法。
8.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-5任一项所述的链表的生成方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310277190.0A CN115982311B (zh) | 2023-03-21 | 2023-03-21 | 一种链表的生成方法、装置、终端设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310277190.0A CN115982311B (zh) | 2023-03-21 | 2023-03-21 | 一种链表的生成方法、装置、终端设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115982311A CN115982311A (zh) | 2023-04-18 |
CN115982311B true CN115982311B (zh) | 2023-06-20 |
Family
ID=85965212
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310277190.0A Active CN115982311B (zh) | 2023-03-21 | 2023-03-21 | 一种链表的生成方法、装置、终端设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115982311B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117271533B (zh) * | 2023-11-22 | 2024-01-16 | 广东海洋大学 | 一种大型数据链表的构建方法、装置及终端设备 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6463527B1 (en) * | 1997-03-21 | 2002-10-08 | Uzi Y. Vishkin | Spawn-join instruction set architecture for providing explicit multithreading |
CN101464898A (zh) * | 2009-01-12 | 2009-06-24 | 腾讯科技(深圳)有限公司 | 一种提取文本主题词的方法 |
CN105468588A (zh) * | 2014-05-30 | 2016-04-06 | 华为技术有限公司 | 字符串匹配方法和装置 |
WO2017008659A1 (zh) * | 2015-07-14 | 2017-01-19 | 阿里巴巴集团控股有限公司 | 一种获取域名后缀的方法及装置 |
CN107015952A (zh) * | 2017-03-24 | 2017-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组和最长公共前缀的正确性验证方法及系统 |
CN108804204A (zh) * | 2018-04-17 | 2018-11-13 | 佛山市顺德区中山大学研究院 | 多线程并行构造后缀数组的方法及系统 |
CN110515655A (zh) * | 2019-08-27 | 2019-11-29 | 内蒙古工业大学 | 一种数据指令分析方法 |
CN110597855A (zh) * | 2019-08-14 | 2019-12-20 | 中山大学 | 一种数据存储方法、终端设备及计算机可读存储介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8914415B2 (en) * | 2010-01-29 | 2014-12-16 | International Business Machines Corporation | Serial and parallel methods for I/O efficient suffix tree construction |
-
2023
- 2023-03-21 CN CN202310277190.0A patent/CN115982311B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6463527B1 (en) * | 1997-03-21 | 2002-10-08 | Uzi Y. Vishkin | Spawn-join instruction set architecture for providing explicit multithreading |
CN101464898A (zh) * | 2009-01-12 | 2009-06-24 | 腾讯科技(深圳)有限公司 | 一种提取文本主题词的方法 |
CN105468588A (zh) * | 2014-05-30 | 2016-04-06 | 华为技术有限公司 | 字符串匹配方法和装置 |
WO2017008659A1 (zh) * | 2015-07-14 | 2017-01-19 | 阿里巴巴集团控股有限公司 | 一种获取域名后缀的方法及装置 |
CN107015952A (zh) * | 2017-03-24 | 2017-08-04 | 广东顺德中山大学卡内基梅隆大学国际联合研究院 | 一种后缀数组和最长公共前缀的正确性验证方法及系统 |
CN108804204A (zh) * | 2018-04-17 | 2018-11-13 | 佛山市顺德区中山大学研究院 | 多线程并行构造后缀数组的方法及系统 |
CN110597855A (zh) * | 2019-08-14 | 2019-12-20 | 中山大学 | 一种数据存储方法、终端设备及计算机可读存储介质 |
CN110515655A (zh) * | 2019-08-27 | 2019-11-29 | 内蒙古工业大学 | 一种数据指令分析方法 |
Non-Patent Citations (1)
Title |
---|
《基于后缀树聚类的传感器网络大数据分类处理》;金振中;中国优秀硕士学位论文全文数据库 信息科技辑 (月刊);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN115982311A (zh) | 2023-04-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Holley et al. | Bifrost: highly parallel construction and indexing of colored and compacted de Bruijn graphs | |
Lemire et al. | Roaring bitmaps: Implementation of an optimized software library | |
US10332008B2 (en) | Parallel decision tree processor architecture | |
JP5265378B2 (ja) | 高性能正規表現パターンマッチングのための方法および装置 | |
US20140019486A1 (en) | Logic Content Processing for Hardware Acceleration of Multi-Pattern Search | |
US20150262062A1 (en) | Decision tree threshold coding | |
CN115982311B (zh) | 一种链表的生成方法、装置、终端设备及存储介质 | |
Goto et al. | Space efficient linear time Lempel-Ziv factorization for small alphabets | |
US20150262063A1 (en) | Decision tree processors | |
CN110059129A (zh) | 数据存储方法、装置及电子设备 | |
EP0961966B1 (en) | N-way processing of bit strings in a dataflow architecture | |
Wei et al. | A fast algorithm for constructing inverted files on heterogeneous platforms | |
CN111028897A (zh) | 一种基于Hadoop的基因组索引构建的分布式并行计算方法 | |
CN115982310B (zh) | 一种自带验证功能的链表生成方法及电子设备 | |
JPS61210478A (ja) | ベクトル処理装置 | |
US9697899B1 (en) | Parallel deflate decoding method and apparatus | |
Blochwitz et al. | Hardware-Accelerated radix-tree based string sorting for big data applications | |
CN114945902A (zh) | 减少i/o开销的混洗归约任务 | |
CN117271533B (zh) | 一种大型数据链表的构建方法、装置及终端设备 | |
EP0638187B1 (en) | Categorizing strings in character recognition | |
Kosolobov et al. | Compressed multiple pattern matching | |
US20240004954A1 (en) | Computer-implemented accumulation method for sparse matrix multiplication applications | |
JP3062119B2 (ja) | 文字列探索用テーブル、その作成方法及び文字列探索方法 | |
CN117971826A (zh) | 一种自带验证功能的大型数据链表的构建方法及构建装置 | |
WO2023062446A1 (en) | Pipelined hardware-implemented database query processing |
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 |