Indexing 压缩排序整数

Indexing 压缩排序整数,indexing,compression,integer,Indexing,Compression,Integer,我正在构建一个索引,它只是连续存储在二进制文件中的几组有序32位整数。问题是这个文件变得相当大。我一直在考虑添加一些压缩方案,但这有点超出我的专业知识。所以我想知道,在这种情况下,哪种压缩算法最有效?此外,解压必须快速,因为此索引将用于进行查找。我认为这非常适合用于此目的(与具有类似压缩比的其他算法相比,解压速度相对较快) 编辑:我的答案只是一个普通的指针。尼亚兹建议对连续数字之间的差异进行编码,这是一个很好的建议。(然而,如果列表没有排序,或者数字的间距非常不规则,我认为使用普通的哈夫曼编码也

我正在构建一个索引,它只是连续存储在二进制文件中的几组有序32位整数。问题是这个文件变得相当大。我一直在考虑添加一些压缩方案,但这有点超出我的专业知识。所以我想知道,在这种情况下,哪种压缩算法最有效?此外,解压必须快速,因为此索引将用于进行查找。

我认为这非常适合用于此目的(与具有类似压缩比的其他算法相比,解压速度相对较快)


编辑:我的答案只是一个普通的指针。尼亚兹建议对连续数字之间的差异进行编码,这是一个很好的建议。(然而,如果列表没有排序,或者数字的间距非常不规则,我认为使用普通的哈夫曼编码也同样有效。事实上,LZW或类似的编码在这种情况下可能是最好的,尽管可能仍然不是很好。)

整数是以密集方式分组还是以稀疏方式分组

我指的是:

[1,2,3,4,42,43,78,79,80,81]

我指的是:

[1,4,7,9,19,42,53,55,78,80]

如果整数以密集方式分组,则可以压缩第一个向量以保持三个范围:

[(1,4)、(42,43)、(78,81)]


这是一个40%的压缩。当然,这种算法在稀疏数据上效果不好,因为压缩数据将比原始数据占用100%的空间。

在投资您自己的方案之前,我会使用现成的bog标准


例如,在Java中,您可以使用来应用gzip压缩。

如果您存储的是紧密相连的整数(例如:1、3、4、5、9、10等),而不是一些随机的32位整数(982346…、3487623412…等),您可以做一件事:

找出相邻数字之间的差异,如2,1,1,4,1。。。等等(在我们的示例中),然后对这些数字进行哈夫曼编码

我认为,如果你直接将哈夫曼编码应用到你拥有的原始数字列表中,它将不起作用

但是,如果您有一个排序的近邻数字列表,很可能通过对数字差异进行哈夫曼编码获得非常好的压缩比,这可能比使用Zip库中使用的LZW算法要好


无论如何,感谢您发布这个有趣的问题。

整数列表上的条件略有不同,但是 这个问题提出了几种可以帮助你的方法

我建议将数据预过滤为
start
和一系列
offset
s。如果您知道偏移量将非常小,您甚至可以将它们编码为1或2字节的量,而不是4字节的量。如果您不知道这一点,每个偏移量仍然可以是4个字节,但是由于它们的差异很小,因此您将获得比存储原始整数更多的重复


在预过滤之后,通过您选择的压缩方案运行您的输出-在字节级别工作的东西,如gzip或zlib,可能会做得非常好。

也许您可以将连续32位整数之间的差异存储为16位整数。

正如您所发现的,N个32位整数的排序序列没有32*N位的数据。这并不奇怪。假设没有重复,对于每个排序的序列,有N!包含相同整数的未排序序列

现在,您如何利用排序序列中的有限信息?许多压缩算法基于对公共输入值使用较短的位字符串进行压缩(Huffman仅使用此技巧)。一些海报已经建议计算数字之间的差异,并压缩这些差异。他们假设这将是一系列小数字,其中许多是相同的。在这种情况下,大多数算法都能很好地压缩差分序列

但是,以斐波那契序列为例。这绝对是排序整数。F(n)和F(n+1)之间的差是F(n-1)。因此,压缩差异序列等同于压缩序列本身——根本没有帮助


所以,我们真正需要的是输入数据的统计模型。给定序列N[0]…N[x],N[x+1]的概率分布是什么?当序列被排序时,我们知道P(N[x+1] 如果您需要快速随机访问查找,那么对差异进行哈夫曼编码(正如尼亚兹所建议的那样)仅仅是成功的一半。您可能还需要某种分页/索引方案,以便很容易提取第n个数字


如果您不这样做,那么提取第n个数字是一个O(n)操作,因为您必须先读取文件的一半并对其进行哈夫曼解码,然后才能找到您要查找的数字。您必须仔细选择页面大小,以平衡存储页面偏移量的开销与查找速度。

MSalters的回答很有趣,但如果您没有正确分析,可能会分散您的注意力。只有47个Fibonacci数适合32位

但他指出了如何通过分析一系列增量来找到要压缩的模式,从而正确地解决这个问题


重要的事情:a)是否存在重复的价值观?如果是,多久一次?(如果重要,将其作为压缩的一部分,如果不例外。)b)它看起来是准随机的吗?这也很好,因为可以找到合适的平均增量。

我认为哈夫曼编码只有在存在一些重复元素的情况下才有效。H