CN105553483B - 一种产生lz77的方法及装置 - Google Patents

一种产生lz77的方法及装置 Download PDF

Info

Publication number
CN105553483B
CN105553483B CN201510906615.5A CN201510906615A CN105553483B CN 105553483 B CN105553483 B CN 105553483B CN 201510906615 A CN201510906615 A CN 201510906615A CN 105553483 B CN105553483 B CN 105553483B
Authority
CN
China
Prior art keywords
array
suffix
character string
psv
nsv
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
Application number
CN201510906615.5A
Other languages
English (en)
Other versions
CN105553483A (zh
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
Original Assignee
Sun Yat Sen University
SYSU CMU Shunde International Joint Research Institute
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 filed Critical Sun Yat Sen University
Priority to CN201510906615.5A priority Critical patent/CN105553483B/zh
Publication of CN105553483A publication Critical patent/CN105553483A/zh
Application granted granted Critical
Publication of CN105553483B publication Critical patent/CN105553483B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/3084Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction using adaptive string matching, e.g. the Lempel-Ziv method
    • H03M7/3086Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction using adaptive string matching, e.g. the Lempel-Ziv method employing a sliding window, e.g. LZ77

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开一种产生LZ77的方法及装置,对长度为n的字符串T,本发明可以将产生LZ77的空间开销降低至4n,即仅需一个长度为n的整型数组空间,相比其它空间开销为8n的***或程序,大幅度减少了空间需求,而且运行速度较快。在实际应用领域,若需要快速产生字符串的LZ77,但字符串规模较大而内存空间又有限,那么可采用本发明提供的LZ77产生方法及装置。

Description

一种产生LZ77的方法及装置
技术领域
本发明涉及一种数据压缩技术领域,尤其涉及一种使用极少空间产生LZ77的方法及装置。
背景技术
LZ77(Lempel-Ziv)是计算机科学中的一个重要概念,由于在字符串文本处理程序中使用LZ77具有良好的效率,因此,LZ77被广泛用于文件压缩,模式识别,序列对齐以及全文索引等诸多领域。实践证明,使用基于LZ77的压缩软件对具有高重复度特征的文本字符串(例如基因文本数据集)进行数据压缩,具有非常高的压缩效率,著名文本压缩软件gzip就采用了LZ77技术。
假设长度为n的字符串T=T[1..n]=T[1]T[2]…T[n],T中所有字符来源于字符集合∑,∑是大小为O(1)的常数字符集,当1≤i≤j≤n,T[i,j]=T[i][i+1]…T[j]为字符子串。字符串T中位置i处的LZ77为一个二元组(pi,li),满足任意i∈[1,n],T[pi,pi+li-1]=T[i,i+li-1],其中pi<i,pi为字符串T中匹配开始位置;li为匹配长度,取最大整数使得T[pi,pi+li-1]=T[i,i+li-1]。若位置i之前不存在任何匹配,则i处的LZ77为(T[i],0)。产生LZ77的一般过程为从左至右扫描字符串T,用贪婪的方式(即寻找最长的匹配字符串)对字符串T逐一解析,生成LZ77并保存。在每一个解析步s(假设该解析步s对应字符串中的T[i]),将生成一个LZ77,如果li>0,那么下一个解析位置为i+li,否则下一个解析位置为i+1。例如:给定字符串T=mmiissiiss,解析结果为(m,0),(1,1),(i,0),(3,1),(s,0),(5,1),(3,4)。根据这些LZ77,可以很容易恢复整个字符串T。特别是当字符串中子串重复率较高时,保存这些LZ77所需空间显然比保存原字符串T所需空间少得多。因此,近十几年来,吸引了众多专家学者研究如何高效产生字符串的LZ77,并出现了较多的产生LZ77的技术方案或***。
然而,现有产生LZ77的技术仍然存在着时间和空间上的技术瓶颈。例如:对于长度为n的字符串,目前最快产生LZ77的KKP技术方案,由等人发明,至少需要2个长度为n的整型数组作为辅助计算空间,假设一个整型单元占4个字节,那么空间总需求至少为8n(不包括存放字符串T的空间及存放LZ77的空间)。在内存空间有限而数据规模又较大情况下,该类产生LZ77的***显然已经不再适用。
发明内容
本发明为克服上述现有技术所述的至少一种缺陷(不足),首先提供一种产生LZ77的方法,该方法从左至右扫描字符串T顺序产生LZ77,该方法能快速产生LZ77,且仅需4n空间,可大幅度减少内存空间需求。
本发明的又一目的是提出了一种产生LZ77的装置,该装置主要分为前置单元和解析单元两大块,通过前置单元生成字符串的PSV/NSV数组,然后通过解析单元顺序解析字符串产生LZ77。
为实现上述目的,本发明提供如下方案:
一种产生LZ77的方法,所述方法包括:
从右往左扫描字符串,使用L/S后缀识别器识别并统计字符串中L和S后缀数量;
若S后缀数量小于或等于L后缀数量,则生成SAS数组;
根据SAS数组,将所有S后缀从小到大进行串接,生成字符串的ΨS数组;
根据ΨS数组,诱导排序L后缀,生成字符串的Ψ数组;
根据Ψ数组,从小到大遍历所有后缀,生成字符串的PSV数组;
从左往右扫描PSV数组中的字符串,在扫描过程中动态生成NSV数组,由PSV和NSV数组产生字符串的LZ77;
若S后缀数量大于L后缀数量,则生成SAL数组;
根据SAL数组,将所有L后缀从大到小进行串接,生成字符串的ΦL数组;
根据ΦL数组,诱导排序S后缀,生成字符串的Φ数组;
根据Φ数组,从大到小遍历所有后缀,生成字符串的NSV数组;
从左往右扫描NSV数组中的字符串,在扫描过程中动态生成PSV数组,由NSV和PSV数组产生字符串的LZ77。
其中,所述L/S后缀识别方法为:假定字符串最后一个字符为’$’,该字符在整个字符串所包含的字符当中最小且唯一,默认为S后缀;然后从字符串倒数第二个字符开始往前扫描,若当前字符比前一字符小,则该后缀为S后缀;或当前字符与前一字符相等且前一后缀为S后缀,则该后缀同为S后缀。除上述两种情况,后缀为L后缀;
其中,所述SAS数组和SAL数组:SAS数组只存放后缀数组SA中有序S后缀;类似,SAL数组只存放后缀数组SA中有序L后缀;
其中,所述根据SAS数组生成ΨS数组:即ΨS[0]存放SAS数组中最小后缀,ΨS[SAS[i]]存放后缀SAS[i+1],若后缀SAS[i]无后继后缀,则ΨS[SAS[i]]=EMPTY;
其中,所述根据SAL数组生成ΦL数组:即ΦL[0]存放SAL数组中最大后缀,ΦL[SAL[i]]存放后缀SAL[i-1],若后缀SAL[i]无前驱后缀,则ΦL[SAL[i]]=EMPTY;
其中,所述后缀数组SA:长度为n的字符串T包含n个后缀,对这n个后缀从小到大按字典顺序排序,并把排序的结果保存在一个整型数组中,该数组则称为后缀数组(suffixarray,简写为SA)。即后缀数组SA第i个位置上存放的后缀在所有后缀中排第i位;
其中,所述根据ΨS数组计算Ψ数组:ΨS中存放的后缀是有序S后缀,在该有序S后缀基础上,推导有序L后缀,使所有后缀从小到大串接,构成数组Ψ,即Ψ[0]存放最小后缀,Ψ[i]存放后缀i的后继后缀;
其中,所述根据ΦL数组计算Φ数组:ΦL中存放的后缀是有序L后缀,在该有序L后缀基础上,推导有序S后缀,使所有后缀从大到小串接好,构成数组Φ,即Φ[0]存放最大后缀,Φ[i]存放后缀i的前驱后缀;
其中,所述PSV和NSV数组:PSV数组同样用来存放后缀,其存放规则为,PSV[SA[i]]中存放的后缀为后缀数组SA中位置i左手边第一个文本小于SA[i]的后缀;类似,在NSV数组中,NSV[SA[i]]中存放的后缀为后缀数组SA中位置i右手边第一个文本小于SA[i]的后缀。
一种产生LZ77的装置,所述产生LZ77的装置包括:前置单元,解析单元及存储模块;
前置单元:根据字符串中L和S后缀的数量关系,选择生成PSV还是NSV数组,两者择其一写入存储模块;
解析单元:从存储模块读取PSV或NSV数组,然后从左到右扫描字符串产生LZ77并保存;
存储模块:用于存放产生LZ77过程中的临时数据;
所述前置单元包含:决策子单元,SAS数组计算子单元,SAL数组计算子单元,ΨS数组计算子单元,ΦL数组计算子单元,Ψ数组计算子单元,Φ数组计算子单元,PSV数组计算子单元和NSV数组计算子单元;
所述决策子单元:读取字符串文本,利用L/S后缀识别器识别并统计L和S后缀数量,从而决定计算后缀数组SAS还是后缀数组SAL
所述SAS数组计算子单元:通过扫描后缀数组SA或直接扫描字符串T,将字符串T中所有S后缀从小到大存放在数组SAS中;
所述SAL数组计算子单元:通过扫描后缀数组SA或直接扫描字符串T,将字符串T中所有L后缀从小到大存放在数组SAL中;
其中,所述后缀数组SA:长度为n的字符串T包含n个后缀,对这n个后缀从小到大按字典顺序排序,并把排序的结果保存在一个整型数组中,该数组则称为后缀数组(SA);即后缀数组SA第i个位置上存放的后缀在所有后缀中排第i位;
所述ΨS数组计算子单元:从存储模块读取SAS数组,计算ΨS数组,并将ΨS数组写回存储模块;
所述ΦL数组计算子单元:从存储模块读取SAL数组,计算ΦL数组,并将ΦL数组写回存储模块;
所述Ψ数组计算子单元:从存储模块读取ΨS数组,计算Ψ数组,并将Ψ数组写回存储模块;
所述Φ数组计算子单元:从存储模块读取ΦL数组,计算Φ数组,并将Φ数组写回存储模块;
所述PSV数组计算子单元:从存储模块读取Ψ数组,计算PSV数组并写回存储模块;
所述NSV数组计算子单元:从存储模块读取Φ数组,计算NSV数组并写回存储模块;
所述解析单元包含:LZ77生成子单元和LZ77存储子单元;
所述LZ77生成子单元:从存储模块读取PSV数组或NSV数组计算LZ77。
与现有技术相比,本发明具有以下优点及有益效果:
对长度为n的字符串T,本发明可以将产生LZ77的空间开销降低至4n,即仅需一个长度为n的整型数组空间,相比其它空间开销为8n的***或程序,大幅度减少了空间需求,而且运行速度较快。在实际应用领域,若需要快速产生字符串的LZ77,但字符串规模较大而内存空间又有限,那么可采用本发明提供的LZ77产生方法及装置。
附图说明
图1为本发明具体实施方案的方法流程图。
图2为本发明的***结构示意图。
具体实施方式
下面结合附图对本发明做进一步的描述,但本发明的实施方式并不限于此。
首先,产生字符串T的LZ77可以通过PSV和NSV数组计算得到。例如:从左往右扫描字符串T,当扫描至T[i]时,只要计算LCP(i,nsv[i])与LCP(i,psv[i]),这里的LCP为最长公共前缀(longest common prefix),函数LCP(i,j)计算后缀i与j的最长公共前缀长度,即从首字符开始比较子串T[i..n]与T[j..n]相同字符的个数。如果LCP(i,nsv[i])>LCP(i,psv[i]),且LCP(i,nsv[i])大于0,那么字符串T位置i处的LZ77为(nsv[i],LCP(i,nsv[i])),否则为(psv[i],LCP(i,psv[i]));如果LCP(i,nsv[i])与LCP(i,psv[i])均等于0,说明字符串T位置i前面没有出现匹配的字符串,那么位置i处的LZ77为:(T[i],0)。由此可见,产生长度为n的字符串T的LZ77,若内存中同时保存PSV和NSV数组,那么空间开销至少为8n(不含字符串T所占空间)。
因此,为尽量减少空间的使用,本发明在计算LZ77过程中复用存储空间,在程序运行任何时间点,除保存字符串T所必需的存储空间,内存中仅维持一个长度为n的整型数组,即空间开销维持在4n。
基于以上所述,本发明实施例提供一种计算LZ77的方法,参见图1,该方法包括以下步骤:
S101:从右往左扫描字符串T,使用L/S后缀识别器统计其中L和S后缀的数量,若S后缀的数量小于或等于L后缀的数量,转S102;否则转S107执行;
S102:计算SAS
分两种情况:
(一)在后缀数组SA的基础上计算SAS
考虑到在某些应用当中,后缀数组SA已经提供,因此,仅需从SA中提取出所有S后缀即可。假设后缀存放从数组索引下标1开始,从SA中提取所有S后缀的方法为:首先,从右往左扫描字符串T,统计后缀数组中各桶的大小,以及各桶所含L和S后缀的数量,这里的“桶”指的是后缀数组中具有相同首字符的后缀在后缀数组中形成一块连续的区域,该区域称为“桶”。在具体一个桶内,所有L和S后缀分别构成相应的L和S子区域,且L子区域位于S子区之前,分别称为L和S子桶。
其次,定义两个指针head和cur,初始均指向SA[1],当从左往右扫描SA后缀数组时,cur指向当前被扫描后缀,根据桶的大小和各桶所含L和S后缀数量,可以判断指针cur所指后缀是否为S后缀。若当前被扫描后缀为S后缀,则将cur所指后缀复制到head所指位置,然后head指针加1。扫描结束后,所有S后缀将有序排列在后缀数组SA左侧。
(二)直接从字符串T计算SAS
该步骤需要实现在4n空间上计算SAS。关于在4n空间上实现后缀数组的构造,业界已经有成熟的方法。例如:SACA-K程序是已知能在4n空间上构建后缀数组SA的程序,SACA-K计算后缀数组的步骤如下:a.计算有序LMS后缀;b.从有序LMS后缀推导有序L后缀;c.从有序L后缀推导有序S后缀,有序L和S后缀则构成SA数组。其中LMS后缀定义为:在字符串T中,若T[i]所对应的后缀i为S后缀,且T[i-1]所对应的后缀i-1为L后缀,那么后缀i为LMS后缀。为提升计算速度,对SACA-K改造如下:a.计算有序LML后缀;b.从有序LML后缀推导有序S后缀,即SAS;那么仅需两步则可在4n空间完成SAS数组的计算。其中LML后缀定义为:在字符串T中,若T[i]对应的后缀i为L后缀,且T[i-1]对应的后缀i-1为S后缀,那么后缀i为LML后缀。
以上两种情况均复用了SA数组的空间,未新开数组空间,因此该步骤空间复杂度为4n。
S103:从存储模块读取SAS,计算ΨS
本步骤需要将所有有序S后缀从小到大串接起来,将SAS复用为ΨS,使得ΨS[i]中存放的后缀为SAS数组中后缀i的后继后缀。步骤如下:
(1)假设有序S后缀数量为k,并且存放于SA[1..k],反转SAS数组,使所有S后缀降序排列于SA[1..k],并且,使SA[0]=SAS[k];
(2)将所有S后缀(除SA S[k])放置于SA数组中的L类型位置。因为S后缀要少于L后缀的数量,因此SA数组中有足够的L类型位置。所述L类型位置为:若T[i]对应的后缀i为L后缀,那么SA[i]所对应位置为L类型位置,否则为S类型位置。将S后缀放置于L类型位置的处理过程为:定义两个指针end和cur,初始,end指向SA[k-1],cur指向SA[n]。指针cur从右往左移动扫描SA数组,若cur所指当前位置为L类型位置,则将指针end所指S后缀复制到该位置,并将end所指位置设为空,end左移指向下一个S后缀,cur指向SA数组下一位置。最终所有S后缀放置于SA数组中的L类型位置;
(3)连接所有S后缀,构成ΨS数组。当所有S后缀放置于L类型位置以后,定义指针pre和cur,分别指向前一个被扫描和当前被扫描后缀,初始,pre=SA[0];然后从右往左扫描SA数组,每扫描一个元素,判断当前cur所指位置是否L类型位置,若为L类型位置且不空,则SA[pre]=SA[cur],pre=SA[cur],SA[cur]=EMPTY;直至所有S后缀都被扫描。
经过上述步骤,SA中保存的是ΨS数组,从ΨS[0]开始,可以从小到大遍历所有S后缀。由于没有新开空间,该步骤空间开销为4n。
S104:从存储模块读取ΨS,计算Ψ;
经过步骤S103,SA数组中存放的是ΨS数组,所有S后缀从小到大被串接起来。在此基础上,需要计算Ψ数组,将所有后缀从小到大串接起来。即在ΨS的基础上用4n空间排序L后缀,步骤如下:
(11)定义数组Lbkts[|∑|]和Lbkte[|∑|],分别用来标识各桶L子桶开始和结束后缀;并对数组初始化为空。这里|∑|为字符集大小。同时,定义数组Sbkts[|∑|]和Sbkte[|∑|],分别用来标识各桶S子桶开始和结束后缀。遍历一次ΨS数组,Sbkts[|∑|]和Sbkte[|∑|]分别得到各桶S子桶开始和结束后缀。
(12)从小到大依次扫描各桶诱导排序L后缀。当扫描具体某个桶时,先扫描L子桶,再扫描S子桶。若当前被扫描后缀的前驱后缀是否为L后缀,若是,那么需要将该前驱后缀放入其对于桶内。例如:若该前驱后缀对应T[i..n],并且假定c=T[i],那么需要判断Lbkts[c]是否为空,若Lbkts[c]为空,说明该桶不含任何后缀,则使Lbkts[c]=i,Lbkte[c]=i,即后缀i为桶c的第一个后缀也是最后一个后缀;否则,使SA[Lbkte[c]]=i,即后缀i为桶的结束后缀。当所有桶被扫描完后,得到Ψ数组。
上述步骤从ΨS计算Ψ,无需新开数组,SA数组被复用为Ψ数组,空间同样维持在4n。
S105:从存储模块读取数组Ψ,计算PSV;
经过步骤S104,Ψ数组已经将所有后缀从小到大串接好,遍历一遍Ψ数组相当于从小到大访问后缀数组SA中所有后缀。那么可以每扫描一个后缀,立即生成该后缀的PSV值,方法为:
(21)定义变量cur和prev,初始cur=Ψ[0],prev=0;
(22)若cur≠0,说明遍历没有结束,那么判断cur是否小于prev,若是则进入循环状态,同时使prev=PSV[prev],直到cur的值大于prev,然后转步骤3;若cur=0,则说明所有后缀遍历完毕,直接跳出循环,计算结束;
(23)使next=Ψ[cur],即用变量next先保存下一个需要扫描的后缀,再做操作Ψ[cur]=prev,prev=cur;随后,将next的值赋给cur,进入下一轮循环,跳转至步骤(22)。
整个步骤不需要新开数组空间,因为Ψ[cur]仅使用一次,Ψ[cur]所存储的cur的后继后缀用临时变量next储存,然后将PSV[cur]值放置于Ψ[cur],随后访问临时变量next扫描下一个后缀。当所有后缀被扫描以后,Ψ变成PSV数组。由于没有新开数组空间,而是复用Ψ为PSV数组,故本步骤空间需求为4n。
S106:从存储模块读取PSV数组,使用4n空间计算LZ77;
定义集合,该集合用来存放文本小于或等于后缀t的后缀。同时定义Ψt,使中的所有后缀构成Ψ的定义。即Ψt[i]存放后缀i的后继后缀,Ψt[imax]=0,Ψt[0]=imin,这里imin和imax分别为中最小和最大的后缀;这样,从Ψt[0]开始,可从小到大遍历中的所有后缀,当t=n时,Ψt=Ψn,Ψn即为Ψ数组。
然后,定义变量t,t从1增至n,从左到右顺序扫描T及PSV数组计算LZ77,定义变量next保存字符串T中下一个需要计算LZ77的位置,初始next为1。具体步骤如下:
(31)判断t是否与next相等,若相等转步骤(32),否则转向步骤(33)。
(32)因t=next,即字符串T中位置t处需要计算LZ77。定义变量psv=PSV[t]和nsv=Ψ[psv],由nsv,psv和T即可计算位置t的LZ77,同时输出下一个需要计算LZ77的位置,即next。转步骤4。
(33)因t≠next,那么当前t为被滑过位置,字符串t处不需要计算LZ77,转步骤(34)。
(34)将后缀t***线性链表Ψt-1,即Ψ[t]=nsv,Ψ[psv]=t,Ψt-1升级为Ψt
(35)t=t+1,如果t≠n,转步骤1。
当t=i时,数组PSV[1..i-1]已经变为数组Ψi-1,而数组PSV[i..n]仍然为PSV数组。当t=n时,字符串T的所有LZ77已经产生完毕,同时也生成了数组Ψ。由于没有新开数组,总的空间开销依然为4n空间。
S107:计算SAL
跟步骤S102类似,也分两种情况:
一、在后缀数组SA的基础上计算SAL
当后缀数组SA已经提供,仅需从SA中提取所有L后缀即可,从SA中提取L后缀的方法与提取S后缀的方法类似,可参考步骤S102,这里不再详述。提取完毕后,所有L后缀将有序排列在后缀数组SA的左侧部分。
二、直接从字符串T计算SAL
从字符串T直接计算SAL步骤如下:a.调用SACA-K程序计算有序LMS后缀;b.在有序LMS后缀基础上推导SAL
以上两种情况均无需新开数组空间,空间开销为4n。
S108:从存储模块读取数组SAL,计算ΦL
经过步骤S107,有序L后缀存放于SA[1..k],在该步骤,需要将所有有序L后缀从大到小串接起来,构成Φ定义。即ΦL[0]存放数组SAL中最大的后缀,ΦL[i]存放SAL数组中后缀i的前驱后缀。步骤如下:
(41)将所有L后缀放置于SA数组中的S类型位置。参考S103步骤(42);
(42)连接所有L后缀,构成ΦL数组。参考S103步骤(43)。
经过上述步骤,SA中保存的是ΦL数组。同样,空间开销为4n。
S109:从存储模块读取ΦL,计算Φ;
经过步骤S108,SA数组中存放的是ΦL数组,即所有L后缀已被从大到小串接。在此基础上,需要计算Φ数组,将字符串T中所有后缀从大到小串接起来,即在有序L后缀的基础上排序S后缀。步骤如下:
(51)定义数组Sbkts[|∑|]和Sbkte[|∑|],分别用来标识各桶S子桶开始和结束后缀,并对数组初始化为空。同时,定义数组Lbkts[|∑|]和Lbkte[|∑|],分别用来标识各桶L子桶的开始和结束后缀。遍历一次ΦL数组,Lbkts[|∑|]和Lbkte[|∑|]分别获得各桶L子桶开始和结束后缀。
(52)从大到小依次扫描各桶,对S后缀进行排序。当扫描具体某个桶时,先扫描S子桶,再扫描L子桶。假设当前被扫描后缀的前驱后缀为i,且后缀i为S类型后缀,那么需要判断该后缀所在桶的开始后缀是否为空,即判断Sbkts[c]是否为空,这里c=T[i]。若Sbkts[c]为空,则使Sbkts[c]和Sbkte[c]均为后缀i;否则,使SA[Sbkts[c]]=i;当所有后缀都被扫描后,得到Φ数组。
上述步骤从ΦL计算Φ,无需新开空间数组空间,SA数组被复用为Φ数组,空间同样维持在4n。
S110:从存储模块读取数组Φ,计算NSV;
经过步骤S109,Φ数组已经将所有后缀从大到小串接好,遍历Φ数组相当于从大到小访问后缀数组中所有后缀。那么可以每扫描一个后缀,立即生成该后缀的NSV值,方法为:
(61)定义变量prev和cur,初始化prev=0,cur=Φ[0],即变量cur保存的是最大的后缀;
(62)若cur≠0,那么判断cur是否小于prev,若是进入循环状态,重复操作prev=NSV[prev],直到cur的值大于prev,转步骤(63);若cur=0,直接跳出循环,计算结束;
(63)当cur的值大于prev,使next=Φ[cur],即先保存下一个需要扫描的后缀,然后使Φ[cur]=prev,prev=cur;
(64)将next的值赋给cur,进入下一轮循环,即跳转至步骤(62)。
同样,由于没有新开数组空间,而是复用Φ为NSV数组,本步骤空间需求维持在4n。
S111:从存储模块读取数组NSV,并使用4n空间计算LZ77。
定义集合,该集合用来存放文本小于或等于后缀t的后缀。同时定义集合Φt,使中的所有后缀构成Φ的定义。即Φt[i]为后缀i的前驱后缀,Φt[imin]=0,Φt[0]=imax,这里imin和imax的分别为中最小和最大的后缀;当t=n时,Φt=Φn,即Φ数组。
定义变量t,t从1增至n,从左到右顺序扫描字符串T及NSV数组计算LZ77,定义变量next保存字符串T中下一个需要计算LZ77的位置。具体步骤如下:
(71)判断t是否与next相等,若相等转步骤(72),否则转向步骤(73)。
(72)因t=next,那么字符串T中位置t处需要计算LZ77。定义变量nsv=NSV[t]和psv=Φ[nsv],由nsv,psv和T计算出位置t的LZ77,同时输出next,转步骤4。
(73)因t≠next,那么当前t为被滑过位置,字符串t处不需要计算LZ77,转步骤(74)。
(74)将后缀t***线性链表Φt-1,即Φ[t]=psv,Φ[nsv]=t,Φt-1升级为Φt
(75)t=t+1,如果t≠n,转步骤1。
当t=i时,数组NSV[1..i-1]已经变为数组Φi-1,而数组NSV[i..n]仍然为NSV数组的右边部分。当t=n,字符串T的所有LZ77已经全部产生。由于没有新开数组,总的空间开销依然为4n空间。
如图2,一种产生LZ77的装置,所述产生LZ77的装置包括:前置单元,解析单元及存储模块;
前置单元:根据字符串中L和S后缀的数量关系,选择生成PSV还是NSV数组,两者择其一写入存储模块;
解析单元:从存储模块读取PSV或NSV数组,然后从左到右扫描字符串产生LZ77并保存;
存储模块:用于存放产生LZ77过程中的临时数据;
所述前置单元包含:决策子单元,SAS数组计算子单元,SAL数组计算子单元,ΨS数组计算子单元,ΦL数组计算子单元,Ψ数组计算子单元,Φ数组计算子单元,PSV数组计算子单元和NSV数组计算子单元;
所述决策子单元:读取字符串文本,利用L/S后缀识别器识别并统计L和S后缀数量,从而决定计算后缀数组SAS还是后缀数组SAL
所述SAS数组计算子单元:通过扫描后缀数组SA或直接扫描字符串T,将字符串T中所有S后缀从小到大存放在数组SAS中;
所述SAL数组计算子单元:通过扫描后缀数组SA或直接扫描字符串T,将字符串T中所有L后缀从小到大存放在数组SAL中;
其中,所述后缀数组SA:长度为n的字符串T包含n个后缀,对这n个后缀从小到大按字典顺序排序,并把排序的结果保存在一个整型数组中,该数组则称为后缀数组(SA);即后缀数组SA第i个位置上存放的后缀在所有后缀中排第i位;
所述ΨS数组计算子单元:从存储模块读取SAS数组,计算ΨS数组,并将ΨS数组写回存储模块;
所述ΦL数组计算子单元:从存储模块读取SAL数组,计算ΦL数组,并将ΦL数组写回存储模块;
所述Ψ数组计算子单元:从存储模块读取ΨS数组,计算Ψ数组,并将Ψ数组写回存储模块;
所述Φ数组计算子单元:从存储模块读取ΦL数组,计算Φ数组,并将Φ数组写回存储模块;
所述PSV数组计算子单元:从存储模块读取Ψ数组,计算PSV数组并写回存储模块;
所述NSV数组计算子单元:从存储模块读取Φ数组,计算NSV数组并写回存储模块;
所述解析单元包含:LZ77生成子单元和LZ77存储子单元;
所述LZ77生成子单元:从存储模块读取PSV数组或NSV数组计算LZ77。
以上所述的本发明的实施方式,并不构成对本发明保护范围的限定。任何在本发明的精神原则之内所作出的修改、等同替换和改进等,均应包含在本发明的权利要求保护范围之内。

Claims (5)

1.一种产生LZ77的方法,其特征在于,所述方法包括:
从右往左扫描字符串,使用L/S后缀识别器识别并统计字符串中L和S后缀数量;
若S后缀数量小于或等于L后缀数量,则生成SAS数组;
根据SAS数组,将所有S后缀从小到大进行串接,生成字符串的ΨS数组;
根据ΨS数组,诱导排序L后缀,生成字符串的Ψ数组;
根据Ψ数组,从小到大遍历所有后缀,生成字符串的PSV数组;
从左到右扫描字符串及PSV数组,在扫描过程中动态生成NSV数组,由PSV和NSV数组产生字符串的LZ77;
若S后缀数量大于L后缀数量,则生成SAL数组;
根据SAL数组,将所有L后缀从大到小进行串接,生成字符串的ΦL数组;
根据ΦL数组,诱导排序S后缀,生成字符串的Φ数组;
根据Φ数组,从大到小遍历所有后缀,生成字符串的NSV数组;
从左到右扫描字符串及NSV数组,在扫描过程中动态生成PSV数组,由NSV和PSV数组产生字符串的LZ77。
2.根据权利要求1所述的产生LZ77的方法,其特征在于,所述L/S后缀识别器的识别方法为:设字符串最后一个字符为‘$’,该字符是整个字符串所包含的字符当中最小且唯一,默认为S后缀;然后从字符串倒数第二个字符开始往前扫描,若当前字符比前一字符小,则该后缀为S后缀;或当前字符与前一字符相等且前一后缀为S后缀,则该后缀同为S后缀;除上述两种情况,后缀为L后缀。
3.根据权利要求2所述的产生LZ77的方法,其特征在于,所述SAS数组和SAL数组:SAS数组只用于存放后缀数组SA中有序S后缀;类似,SAL数组只用于存放后缀数组SA中有序L后缀;
所述根据SAS数组生成ΨS数组:即ΨS[0]存放SAS数组中最小后缀,ΨS[SAS[i]]存放后缀SAS[i+1],若后缀SAS[i]无后继后缀,则ΨS[SAS[i]]=EMPTY;
所述根据SAL数组生成ΦL数组:即ΦL[0]存放SAL数组中最大后缀,ΦL[SAL[i]]存放后缀SAL[i-1],若后缀SAL[i]无前驱后缀,则ΦL[SAL[i]]=EMPTY;
其中,所述后缀数组SA:长度为n的字符串包含n个后缀,对这n个后缀从小到大按字典顺序排序,并把排序的结果保存在一个整型数组中,该数组则称为后缀数组(SA);即后缀数组SA第i个位置上存放的后缀在所有后缀中排第i位。
4.根据权利要求3所述的产生LZ77的方法,其特征在于,所述根据ΨS数组计算Ψ数组:ΨS中存放的后缀是有序S后缀,在该有序S后缀基础上,推导有序L后缀,使所有后缀从小到大串接,构成数组Ψ,即Ψ[0]存放最小后缀,Ψ[i]存放后缀i的后继后缀;
所述根据ΦL数组计算Φ数组:ΦL中存放的后缀是有序L后缀,在该有序L后缀基础上,推导有序S后缀,使所有后缀从大到小串接好,构成数组Φ,即Φ[0]存放最大后缀,Φ[i]存放后缀i的前驱后缀;
其中,所述PSV和NSV数组:PSV数组同样用来存放后缀,其存放规则为,PSV[SA[i]]中存放的后缀为后缀数组SA中位置i左手边第一个文本小于SA[i]的后缀;类似,在NSV数组中,NSV[SA[i]]中存放的后缀为后缀数组SA中位置i右手边第一个文本小于SA[i]的后缀。
5.一种产生LZ77的装置,其特征在于,包括:前置单元,解析单元及存储模块;
前置单元:根据字符串中L和S后缀的数量关系,选择生成PSV还是NSV数组,两者择其一写入存储模块;
解析单元:从存储模块读取PSV或NSV数组,然后从左到右扫描字符串产生LZ77并保存;
存储模块:用于存放产生LZ77过程中的临时数据;
所述前置单元包含:决策子单元,SAS数组计算子单元,SAL数组计算子单元,ΨS数组计算子单元,ΦL数组计算子单元,Ψ数组计算子单元,Φ数组计算子单元,PSV数组计算子单元和NSV数组计算子单元;
所述决策子单元:读取字符串文本,利用L/S后缀识别器识别并统计L和S后缀数量,从而决定计算后缀数组SAS还是后缀数组SAL
所述SAS数组计算子单元:通过扫描后缀数组SA或直接扫描字符串,将字符串中所有S后缀从小到大存放在数组SAS中;
所述SAL数组计算子单元:通过扫描后缀数组SA或直接扫描字符串,将字符串中所有L后缀从小到大存放在数组SAL中;
其中,所述后缀数组SA:长度为n的字符串包含n个后缀,对这n个后缀从小到大按字典顺序排序,并把排序的结果保存在一个整型数组中,该数组则称为后缀数组(SA);即后缀数组SA第i个位置上存放的后缀在所有后缀中排第i位;
所述ΨS数组计算子单元:从存储模块读取SAS数组,计算ΨS数组,并将ΨS数组写回存储模块;
所述ΦL数组计算子单元:从存储模块读取SAL数组,计算ΦL数组,并将ΦL数组写回存储模块;
所述Ψ数组计算子单元:从存储模块读取ΨS数组,计算Ψ数组,并将Ψ数组写回存储模块;
所述Φ数组计算子单元:从存储模块读取ΦL数组,计算Φ数组,并将Φ数组写回存储模块;
所述PSV数组计算子单元:从存储模块读取Ψ数组,计算PSV数组并写回存储模块;
所述NSV数组计算子单元:从存储模块读取Φ数组,计算NSV数组并写回存储模块;
所述解析单元包含:LZ77生成子单元和LZ77存储子单元;
所述LZ77生成子单元:从存储模块读取PSV数组或NSV数组计算LZ77。
CN201510906615.5A 2015-12-09 2015-12-09 一种产生lz77的方法及装置 Active CN105553483B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510906615.5A CN105553483B (zh) 2015-12-09 2015-12-09 一种产生lz77的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510906615.5A CN105553483B (zh) 2015-12-09 2015-12-09 一种产生lz77的方法及装置

Publications (2)

Publication Number Publication Date
CN105553483A CN105553483A (zh) 2016-05-04
CN105553483B true CN105553483B (zh) 2018-12-21

Family

ID=55832447

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510906615.5A Active CN105553483B (zh) 2015-12-09 2015-12-09 一种产生lz77的方法及装置

Country Status (1)

Country Link
CN (1) CN105553483B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107169315B (zh) * 2017-03-27 2020-08-04 广东顺德中山大学卡内基梅隆大学国际联合研究院 一种海量dna数据的传输方法及***
CN109299112B (zh) * 2018-11-15 2020-01-17 北京百度网讯科技有限公司 用于处理数据的方法和装置

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004206269A (ja) * 2002-12-24 2004-07-22 Sony Corp 情報処理装置および方法
CN1870131A (zh) * 2005-05-23 2006-11-29 索尼株式会社 字符串检索电路和字符串检索方法
JP2012235289A (ja) * 2011-04-28 2012-11-29 Fujitsu Ltd 圧縮装置、圧縮方法、圧縮プログラムおよび復元装置
CN103023509A (zh) * 2012-11-14 2013-04-03 无锡芯响电子科技有限公司 一种硬件lz77压缩实现***及其实现方法
WO2014114506A1 (de) * 2013-01-22 2014-07-31 Jacobs University Bremen Ggmbh Verfahren zur kompression von quelldaten unter nutzung von symmetrien und einrichtung zur durchführung des verfahrens
CN104202054A (zh) * 2014-09-16 2014-12-10 东南大学 一种硬件lzma压缩实现***及方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2524515A (en) * 2014-03-25 2015-09-30 Ibm Method to improve compression ratio for a compression engine

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2004206269A (ja) * 2002-12-24 2004-07-22 Sony Corp 情報処理装置および方法
CN1870131A (zh) * 2005-05-23 2006-11-29 索尼株式会社 字符串检索电路和字符串检索方法
JP2012235289A (ja) * 2011-04-28 2012-11-29 Fujitsu Ltd 圧縮装置、圧縮方法、圧縮プログラムおよび復元装置
CN103023509A (zh) * 2012-11-14 2013-04-03 无锡芯响电子科技有限公司 一种硬件lz77压缩实现***及其实现方法
WO2014114506A1 (de) * 2013-01-22 2014-07-31 Jacobs University Bremen Ggmbh Verfahren zur kompression von quelldaten unter nutzung von symmetrien und einrichtung zur durchführung des verfahrens
CN104202054A (zh) * 2014-09-16 2014-12-10 东南大学 一种硬件lzma压缩实现***及方法

Also Published As

Publication number Publication date
CN105553483A (zh) 2016-05-04

Similar Documents

Publication Publication Date Title
Padmaja et al. Comparative study of feature subset selection methods for dimensionality reduction on scientific data
CN107609356B (zh) 基于标签模型的文本无载体信息隐藏方法
US5655129A (en) Character-string retrieval system and method
CN105183788A (zh) 一种基于关键词字典树检索的中文ac自动机工作方法
CN106959962B (zh) 一种多模式字符串匹配方法和装置
CN102750379B (zh) 一种基于过滤型的字符串快速匹配方法
Crochemore et al. Fast computation of a longest increasing subsequence and application
CN105335481B (zh) 一种大规模字符串文本的后缀索引构造方法及装置
CN107332567B (zh) 编码方法和装置
CN102867049B (zh) 一种基于单词查找树实现的汉语拼音快速分词方法
CN107015952B (zh) 一种后缀数组和最长公共前缀的正确性验证方法及***
CN105553483B (zh) 一种产生lz77的方法及装置
CN108509505A (zh) 一种基于分区双数组Trie的字符串检索方法及装置
CN101964046B (zh) 条码扫描及识别方法
CN106940708A (zh) 一种基于二分查找法实现ip范围定位的方法及***
EP3955256A1 (en) Non-redundant gene clustering method and system, and electronic device
CN103401569A (zh) 一种(n,k,m)***卷积码盲识别的方法
CN1040694A (zh) 联机手写字符识别装置
CN110046219A (zh) 一种基于哈希算法的中文分词方法
CN108920483A (zh) 基于后缀数组的字符串快速匹配方法
CN104036141A (zh) 一种基于OpenCL的红黑树加速算法
CN109508371B (zh) 一种结合集束搜索间隔最大化约束的文本摘要生成方法
CN102841988A (zh) 一种对核酸序列信息进行匹配的***和方法
CN115525617A (zh) 用于日志模板的提取方法及装置、服务器、存储介质
JP4208326B2 (ja) 情報索引装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant