我正在构建一个索引,它只是几个有序的32位整数集连续存储在一个二进制文件中。问题在于这个文件变得相当大。我一直在考虑添加一些压缩方案,但那超出了我的专业领域。所以我想知道,哪种压缩算法在这种情况下最好?此外,解压缩必须很快,因为这个索引将用于进行查找。
我正在构建一个索引,它只是几个有序的32位整数集连续存储在一个二进制文件中。问题在于这个文件变得相当大。我一直在考虑添加一些压缩方案,但那超出了我的专业领域。所以我想知道,哪种压缩算法在这种情况下最好?此外,解压缩必须很快,因为这个索引将用于进行查找。
如果你存储的整数非常接近(例如:1、3、4、5、9、10等),而不是一些随机的32位整数(如982346...、3487623412...等),可以做以下事情:
找出相邻数字之间的差异,就像2、1、1、4、1等(在我们的例子中),然后对这些数字进行Huffman编码。
我认为如果您直接将Huffman编码应用于您拥有的原始数字列表,它可能不起作用。
但是,如果您有一个排序好的附近数字列表,很有可能通过对数字差异进行Huffman编码来获得非常好的压缩比率,甚至比Zip库中使用的LZW算法更好。
无论如何,感谢您发布这个有趣的问题。
n=n+a;a+=1
这样的系列,这肯定会有帮助。 - Georg SchöllyMSalters的回答很有趣,但如果你没有正确分析可能会分散你的注意力。只有47个斐波那契数适合32位。
但他在如何通过分析增量序列来找到模式以进行压缩方面是正确的。
重要的事情:a)是否有重复的值?如果有,多久出现一次?(如果重要,请将其作为压缩的一部分,如果不重要,请将其作为例外处理。)b)它看起来准随机吗?这也可以作为寻找合适平均增量的好方法。
我认为哈夫曼编码可能是这个目的相当合适的选择(与其他具有相似压缩比的算法相比,速度相对较快)。
编辑:我的回答只是一个一般的指针。Niyaz建议将连续数字之间的差异进行编码是一个不错的选择。(然而,如果列表不排序或数字的间距非常不规则,我认为使用普通的哈夫曼编码也同样有效。实际上,在这种情况下,LZW或类似的方法可能是最好的选择,尽管可能仍然不是很好。)
整数列表的条件略有不同,但问题压缩唯一数据流提供了几种可能有用的方法。
我建议将数据预过滤为一个start
和一系列offset
。如果您知道偏移量可靠地很小,甚至可以将它们编码为1或2字节的数量,而不是4字节。如果您不知道这一点,每个偏移量仍然可以是4字节,但由于它们将是小差异,因此您将获得比存储原始整数更多的重复。
在预过滤之后,通过您选择的压缩方案运行输出 - 像gzip或zlib这样在字节级别上工作的东西可能会做得非常好。