基于分区的正整数序列压缩方法与流程

文档序号:11593801阅读:261来源:国知局
本发明涉及数据处理
技术领域
,尤其涉及一种基于分区的正整数序列压缩方法。
背景技术
:正整数序列压缩的主要目的是减少正整数序列占用的存储空间、减少使用时磁盘读取次数和加快数据的传输效率。比如:在信息检索中,正整数序列的压缩常用于压缩倒排索引中文档标识符(docid)序列、频率(frequency)序列和位置(position)序列,一方面可以节省倒排索引文件占用的存储空间;另一方面可以减少查询时的磁盘和内存读取次数。互联网上数据呈现爆炸式增长,由这些数据构造的倒排索引需要的存储空间也越来越大,因此,开发一种对正整数序列进行有效的压缩编码方法是一个亟待解决的问题。技术实现要素:本发明的实施例提供了一种基于分区的正整数序列压缩方法,以实现对正整数序列进行有效的压缩编码。为了实现上述目的,本发明采取了如下技术方案。一种基于分区的正整数序列压缩方法,包括:通过正整数序列构造单调递增正整数序列s;构造所述单调递增正整数序列s的有向无环图g,该有向无环图g的顶点为v0,v1,…,vn-1,vn;使用迪杰斯特拉算法计算所述有向无环图g的从v0到vn的最短路径π=(v0,vi)(vi,vj)…(vm,vn);根据所述最短路径π=(v0,vi)(vi,vj)…(vm,vn),得到所述单调递增正整数序列s的最优划分为δ={s1,s2,…,si}{si+1,si+2,…,sj}…{sm+1,sm+2,…,sn},区块{si+1,si+2,…,sj}记作parti+1,j;计算区块parti+1,j的元素个数counti+1,j和区块parti+1,j采用golomb-rice编码时需要的参数bi+1,j;采用eliasgamma编码对元素个数counti+1,j进行编码,计作elias_gamma(counti+1,j);采用eliasgamma编码对参数bi+1,j进行编码,计作elias_gamma(bi+1,j);将所述elias_gamma(counti+1,j)和elias_gamma(bi+1,j)拼接在一起,计作info(parti+1,j);采用以bi+1,j为参数的golomb-rice编码对parti+1,j的所有元素进行编码,然后拼接在一起计作grcodei+1,j;按照最优划分区块parti+1,j的顺序拼接所述info(parti+1,j),拼接为info;按照最优划分区块parti+1,j的顺序拼接grcodei+1,j,拼接为golomb-rice-code;把所述info和所述golomb-rice-code拼接在一起,作为所述单调递增正整数序列s的压缩结果。进一步地,所述的通过正整数序列构造单调递增整数序列,包括:构造正整数序列的前缀和序列,将所述前缀和序列作为单调递增整数序列,过程如下:假设x=x1,x2,…,xn是正整数序列,其前缀和序列为s=s1,s2,…,sn,则进一步地,所述的构造所述单调递增正整数序列s的有向无环图g,该有向无环图g的顶点为v0,v1,…,vn-1,vn,包括:所述有向无环图g的顶点记做v0,v1,…,vn-1,vn,对于任意i和j满足i<j≤n,有向无环图g中存在一条vi到vj的边,记做(vi,vj),序列s的一个划分对应有向无环图g中的一条路径,序列s的最优划分对应有向无环图g的最短路径,有向无环图g中一个边(vi,vj)对应序列s划分的一个区块{si+1,si+2,…,sj},计作parti+1,j,边(vi,vj)的权重计做w(vi,vj),w(vi,vj)指对parti+1,j压缩存储后所需要的比特数。进一步地,边(vi,vj)的权重w(vi,vj)的计算步骤包括:1:计算序列ci+1,j={ci+1,ci+2,…,cj}={si+1-si,si+2-si,…,sj-si},假设s0=0;2:计算区块parti+1,j的元素个数counti+1,j=j-i的eliasgamma编码所需要的比特数w1;3:对序列ci+1,j进行差分处理得到序列di+1,j={ci+1-0,ci+2-ci+1,…,cj-cj-1};4:计算序列di+1,j的采用golomb-rice编码时需要的参数bi+1,j,计算参数bi+1,j采用elias-gamma编码所需要的比特数w2;5:利用参数bi+1,j计算序列di+1,j中的每一个元素的golomb-rice编码,并将这些编码按照元素在序列中的顺序连接在一起,得到grcodei+1,j,grcodei+1,j的长度为w3;6:w(vi,vj)=w1+w2+w3。进一步地,所述的使用迪杰斯特拉算法计算所述有向无环图g的从v0到vn的最短路径π=(v0,vi)(vi,vj)…(vm,vn),包括:使用迪杰斯特拉算法利用所述有向无环图g中的各个边的权重值计算所述有向无环图g的从v0到vn的最短路径π=(v0,vi)(vi,vj)…(vm,vn)。进一步地,计算区块parti+1,j的elias_gamma(counti+1,j),elias_gamma(bi+1,j)和grcodei+1,j的具体步骤如下:1:parti+1,j={si+1,si+2,…,sj},计算序列ci+1,j={ci+1,ci+2,…,cj}={si+1-si,si+2-si,…,sj-si},假设s0=0;2:计算j-i为该区块的元素个数counti+1,j,按照eliasgamma编码规则,得到elias_gamma(counti+1,j);3:对序列ci+1,j进行差分处理得到序列di+1,j={ci+1-0,ci+2-ci+1,…,cj-cj-1};4:计算序列di+1,j的采用golomb-rice编码时需要的参数bi+1,j,按照eliasgamma编码规则,得到elias_gamma(bi+1,j);5:利用参数bi+1,j计算序列di+1,j中的每一个元素的golomb-rice编码,并将这些编码按照元素在序列中的顺序连接在一起,得到grcodei+1,j。由上述本发明的实施例提供的技术方案可以看出,本发明实施例综合了序列分区编码利用正整数序列的局部“聚集”性质与golomb-rice编码的高效性等优点,提高的正整数序列的压缩性能,对节省数据空间占用、减少使用时磁盘读取次数和加快数据传输效率有很重要的意义。本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。附图说明为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下。图1为本发明实施例提供的一种基于分区的正整数序列压缩方法的流程图;图2是本发明实施例提供的一种单调递增正整数序列s的有向无环图g的示意图。具体实施方式下面详细描述本发明的实施方式,所述实施方式的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施方式是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。本
技术领域
技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。除非另外定义,这里使用的所有术语(包括技术术语和科学术语)具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样定义,不会用理想化或过于正式的含义来解释。为便于对本发明实施例的理解,下面将结合附图以几个具体实施例为例做进一步的解释说明,且各个实施例并不构成对本发明实施例的限定。本发明实施例提供了一种基于分区的正整数序列压缩方法的流程图如图1所示,该方法包括以下步骤:输入:正整数序列x={x1,x2,…,xn}其中xi为正整数。步骤1、根据正整数序列x构造单调递增正整数序列s;(1)如果此正整数序列x是单调递增正整数序列,s=x;(2)如果此正整数序列x不是单调递增正整数序列,则构造x的前缀和序列作为s。假设x={x1,x2,…,xn}是正整数序列,x={x1,x2,…,xn},其中序列s单调递增。例如:正整数序列s={1,2,5,3,1,6},则由z得到s为:s={x1,x1+x2,x1+x2+x3,x1+x2+x3+x4,x1+x2+x3+x4+x5,x1+x2+x3+x4+x5+x6}={1,3,8,11,12,18}。步骤2、根据单调递增正整数序列s构造序列s的有向无环图g。假设s={s1,s2,…,sn}。g的顶点记做v0,v1,…,vn-1,vn,对于任意i和j满足i<j≤n,图g中存在一条vi到vj的边,记做(vi,vj),边(vi,vj)的权重计做w(vi,vj)。序列s的一个划分对应图g中的一条路径,序列s的最优划分对应图g的最短路径。图g中一个边(vi,vj)对应序列s划分的一个区块{si+1,si+2,…,sj},w(vi,vj)指对区块{si+1,si+2,…,sj}(计作parti+1,j)压缩存储后所需要的比特数。w(vi,vj)具体计算步骤如下:1、计算序列ci+1,j={ci+1,ci+2,…,cj}={si+1-si,si+2-si,…,sj-si},假设s0=0;2、计算j-i(parti+1,j区块元素个数counti+1,j)的eliasgamma编码所需要的比特数w1;3、对序列ci+1,j进行差分处理得到序列di+1,j={ci+1-0,ci+2-ci+1,…,cj-cj-1};4、计算序列di+1,j的采用golomb-rice编码时需要的参数bi+1,j,计算参数bi+1,j采用elias-gamma编码所需要的比特数w2;5、利用4中得到的参数bi+1,j计算序列di+1,j中的每一个元素的golomb-rice编码,并将这些编码按照元素在序列中的顺序连接在一起,得到grcodei+1,j,grcodei+1,j的长度为w3。6、w(vi,vj)=w1+w2+w3。如:单调递增正整数序列s={s1,s2,s3,s4,s5,s6}={1,3,9,1012,1015,1030}对应的有向无环图g的点集合{v0,v1,v2,v3,v4,v5,v6},如图2所示,以边(v0,v3)和边(v3,v6)为例说明图2中各边权重的计算过程。图2中边(v0,v3)的权重w(v0,v3)计算过程:边(v0,v3)对应序列s划分的区块{s1,s2,s3}1、序列c1,3={c1,c2,c3}={s1-s0,s2-s0,s3-s0}={1,3,9};2、区块元素个数为count1,3=3,使用elias-gamma编码对3进行编码的结果为011,空间占用bits数为w1=3;3、对序列c1,3={1,3,9}进行差分处理得到序列d1,3={c1-0,c2-c1,c3-c2}={1,2,6};4、对序列d1,3={1,2,6}计算参数使用elias-gamma编码对b1,3=1进行编码的结果为1,空间占用bits数为w2=1;5、使用golomb-rice编码对d1,3={1,2,6}进行编码的结果为1101000010,利用4中得到的参数b1,3=1计算序列d1,3中的每一个元素的golomb-rice编码,d1,3[0]=1,其golomb-rice编码为golomb-rice(d1,3[0])=11d1,3[1]=2,其golomb-rice编码为golomb-rice(d1,3[1])=010d1,3[2]=6,其golomb-rice编码为golomb-rice(d1,3[2])=00010golomb-rice(d1,3[0]),golomb-rice(d1,3[1]),golomb-rice(d1,3[2])依次连接在一起,得到grcodei+1,j=1101000010,其长度为10,即空间占用bits数为w3=10;6、w(v0,v3)=w1+w2+w3=3+1+10=14。图g中边(v3,v6)的权重w(v3,v6)的计算过程:边(v3,v6)对应序列s划分的区块{s4,s5,s6}。1、计算序列c4,6={c4,c5,c6}={s4-s3,s5-s3,s6-s3}={1003,1006,1021};2、区块元素个数为count4,6=3,使用elias-gamma编码对3进行编码的结果为011,空间占用bits数为w1=3;3、对序列c4,6={1003,1006,1021}进行差分处理得到序列d4,6={c4-0,c5-c4,c6-c5}={1003,3,15};4、根据序列d4,6={1003,3,15}计算参数使用elias-gamma编码对b4,6=8进行编码为0001000,长度为7,因此其空间占用bits数为w2=7;5、使用golomb-rice编码对d4,6={1003,3,15}进行编码为000111101011100000011100001111,空间占用bits数为w3=30;利用4中得到的参数b4,6=8计算序列d4,6中的每一个元素的golomb-rice编码,d4,6[0]=1003,其golomb-rice编码为golomb-rice(d4,6[0])=000111101011d4,6[1]=3,其golomb-rice编码为golomb-rice(d4,6[1])=100000011d4,6[2]=15,其golomb-rice编码为golomb-rice(d4,6[2])=100001111golomb-rice(d4,6[0]),golomb-rice(d4,6[1]),golomb-rice(d4,6[2])依次连接在一起,得到grcodei+1,j=000111101011100000011100001111,其长度为30,空间占用bits数为w3=306、w(v3,v6)=w1+w2+w3=3+7+30=40。图g中所有的边的权重如表1所示,第i行第j列的数值为w(vi,vjv0v1v2v3v4v5v6v0-4914495865v1--513404958v2---8314051v3----193140v4-----515v5------9v6-------表1图g中所有的边的权重步骤3、使用迪杰斯特拉(dijkstra)算法利用上述表1中的图g中的各个边的权重值计算图g的从v0到vn的最短路径π=(v0,vi)(vi,vj)…(vm,vn)。本例中,图g的从v0到v6最短路径为π=(v0,v3)(v3,v6)。步骤4、根据最短路径π=(v0,vi)(vi,vj)…(vm,vn),得到序列s的最优划分为δ={s1,s2,…,si}{si+1,si+2,…,sj}…{sm+1,sm+2,…,sn},区块{si+1,si+2,…,sj}记作parti+1,j。本例中,s的最优划分为δ={s1,s2,s3}{s4,s5,s6},即part1,3={1,3,9},part4,6={1012,1015,1030}。步骤5、计算每一个区块parti+1,j的元素个数counti+1,j和区块parti+1,j采用golomb-rice编码时需要的参数bi+1,j;采用eliasgamma编码对元素个数counti+1,j进行编码,计作elias_gamma(counti+1,j);采用eliasgamma编码对参数bi+1,j进行编码,计作elias_gamma(bi+1,j);采用以bi+1,j为参数的golomb-rice编码对parti+1,j的所有元素进行编码,然后拼接在一起计作grcodei+1,j。计算区块parti+1,j的elias_gamma(counti+1,j),elias_gamma(bi+1,j)和grcodei+1,j的具体步骤如下:1、parti+1,j={si+1,si+2,…,sj},计算序列ci+1,j={ci+1,ci+2,…,cj}={si+1-si,si+2-si,…,sj-si},假设s0=0;2、计算j-i为该区块的元素个数counti+1,j,按照eliasgamma编码规则,得到elias_gamma(counti+1,j);3、对序列ci,j进行差分处理得到序列di+1,j={ci+1-0,ci+2-ci+1,…,cj-cj-1};4、计算序列di+1,j的采用golomb-rice编码时需要的参数bi+1,j,按照eliasgamma编码规则,得到elias_gamma(bi+1,j);5、利用4中得到的参数bi+1,j计算序列di+1,j中的每一个元素的golomb-rice编码,并将这些编码按照元素在序列中的顺序连接在一起,得到grcodei+1,j。本例中:划分δ有2个区块,part1,3={1,3,9}和part4,6={1003,1006,1021}计算区块part1,3的elias_gamma(count1,3),elias_gamma(b1,3)和grcode1,3的具体步骤如下:1、根据part1,3={1,3,9}计算序列c1,3={s1-s0,s2-s0,s3-s0}={1,3,9},假设s0=0;2、计算j-i=3为该区块的元素个数count1,3,按照eliasgamma编码规则,得到elias_gamma(count1,3)=elias_gamma(3)=011;3、对序列c1,3进行差分处理得到序列d1,3={c1-0,c2-c1,c3-c2}={1,2,6};4、计算序列d1,3的采用golomb-rice编码时需要的参数b1,3,按照eliasgamma编码规则对b1,3=1进行编码,得到elias_gamma(b1,3)=elias_gamma(1)=1;5、利用4中得到的参数b1,3=1计算序列d1,3中的每一个元素的golomb-rice编码,d1,3[0]=1,其golomb-rice编码为golomb-rice(d1,3[0])=11d1,3[1]=2,其golomb-rice编码为golomb-rice(d1,3[1])=010d1,3[2]=6,其golomb-rice编码为golomb-rice(d1,3[2])=00010golomb-rice(d1,3[0]),golomb-rice(d1,3[1]),golomb-rice(d1,3[2])依次连接在一起,得到grcode1,3=1101000010;计算区块part4,6的elias_gamma(count4,6)),elias_gamma(b4,6)和grcode4,6的具体步骤如下:1、根据part4,6={1012,1015,1030}计算序列c4,6={s4-s3,s5-s3,s6-s3}={c4,c5,c6}={1003,1006,1021},;2、计算j-i=3为该区块的元素个数count4,6,按照eliasgamma编码规则,得到elias_gamma(count4,6)=elias_gamma(3)=011;3、对序列c4,6进行差分处理得到序列d4,6={c4-0,c5-c4,c6-c5}={1003,3,15};4、计算序列d4,6的采用golomb-rice编码时需要的参数b4,6,按照eliasgamma编码规则对b4,6=8进行编码,得到elias_gamma(b4,6)=elias_gamma(8)=0001000;5、利用4中得到的参数b4,6=8计算序列d4,6中的每一个元素的golomb-rice编码,d4,6[0]=1003,其golomb-rice编码为golomb-rice(d4,6[0])=000111101011d4,6[1]=3,其golomb-rice编码为golomb-rice(d4,6[1])=100000011d4,6[2]=15,其golomb-rice编码为golomb-rice(d4,6[2])=100001111golomb-rice(d4,6[0]),golomb-rice(d4,6[1]),golomb-rice(d4,6[2])依次连接在一起,得到grcode4,6=golomb-rice(d4,6[0])golomb-rice(d4,6[1])golomb-rice(d4,6[2])=000111101011100000011100001111;步骤6:把最优划分中的每个区块parti+1,j的elias_gamma(counti+1,j)和elias_gamma(bi+1,j)拼接在一起计为info(parti+1,j)。本例中info(part1,3)=0111,info(part4,6)=0110001000。步骤7:按照最优划分区块parti+1,j的顺序拼接info(parti+1,j),记为info。本例中info(part1,3)=0111,info(part4,6)=0110001000,info=info(part1,3)info(part4,6)=01110110001000。步骤8:按照最优划分区块parti+1,j的顺序拼接grcodei+1,j,记为golomb-rice-code。本例中grcode1,3=1101000010,grcode4,6=000111101011100000011100001111。golomb-rice-code=grcode1,3grcode4,6=1101000010000111101011100000011100001111。步骤9:将info和golomb-rice-code拼接在一起计作result。result=011101100010001101000010000111101011100000011100001111.result为最后的单调递增正整数序列s的压缩结果。上述unary编码的编码规则如下:对于一个给定的非负整数n,unary编码将n表示为n个0后面跟着一个1。unary编码的编码格式如下:比如n=6,使用unary编码对n进行编码的结果为:0000001。elias-gamma编码的编码规则如下:对于一个给定的正整数n,将其分解为n=2n+m(其中),n的elias-gamma编码由两个部分组成,第一部分是n的unary编码,第二部分是m的n位二进制编码。比如n=10,10=23+2,使用elias-gamma编码对n进行编码的第一部分为:0001,第二部分为:010,n的elias-gamma编码结果为:0001010。golomb-rice编码的编码规则如下:对于一个给定的正整数n,用一个参数将n分解为n=q*m+r,q用unary编码表示;r=n-q*m,r用b位二进制编码表示,将q用unary编码的编码结果和r用b位二进制编码的编码结果连接在一起即为n的golomb-rice编码结果。golomb-rice编码的编码格式如下:比如n=130,取参数m=2b=27=128,则r=n-q*m=130-1*128=2;得到n=130的golomb-rice编码为:010000010。综上所述,本发明实施例综合了序列分区编码利用正整数序列的局部“聚集”性质与golomb-rice编码的高效性等优点,提高的正整数序列的压缩性能,对节省数据空间占用、减少使用时磁盘读取次数和加快数据传输效率有很重要的意义。本发明实施例的方法可以很方便地嵌入到其它需要对正整数序列压缩的系统中,有很广泛的应用前景。本领域普通技术人员可以理解:附图只是一个实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本
技术领域
的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1