我有一个很大的数组,它的整数范围大部分是连续的,例如1-100,110-160等,所有的整数都是正数。最好的压缩算法是什么?
我尝试了deflate算法,但它只提供了50%的压缩。请注意,算法不能是有损的。
所有的数字都是唯一的,并且逐渐递增。
另外,如果你能告诉我这种算法的java实现,那就太好了。
发布于 2013-02-13 06:28:40
我们最近写了一些研究论文,调查了解决这个问题的最佳方案。请参阅:
Daniel Lemire和Leonid Boytsov,通过矢量化每秒解码数十亿个整数,软件:实践和经验45 (1),2015。http://arxiv.org/abs/1209.2137
Daniel Lemire,Nathan Kurz,Leonid Boytsov,SIMD压缩和排序整数的交集,软件:实践和经验(即将出现) http://arxiv.org/abs/1401.6399
它们包括广泛的实验评估。
您可以在C++11 online中找到所有技术的完整实现:https://github.com/lemire/FastPFor和https://github.com/lemire/SIMDCompressionAndIntersection
还有一些C库:https://github.com/lemire/simdcomp和https://github.com/lemire/MaskedVByte
如果您更喜欢Java,请参阅https://github.com/lemire/JavaFastPFOR
发布于 2008-11-12 10:57:11
首先,通过获取每个值与前一个值之间的差值来预处理您的值列表(对于第一个值,假设前一个值为零)。在您的情况下,这应该主要提供一个1序列,大多数压缩算法可以更容易地压缩这些序列。
这就是PNG格式改进其压缩的方法(它采用几种不同的方法之一,然后使用与gzip相同的压缩算法)。
发布于 2008-11-12 08:35:35
好吧,我投票给更聪明的方式。您需要存储的所有内容是int:startnumber在本例中,您将把示例数组转换为4xInt值。在此之后,您可以根据需要进行压缩:)
https://stackoverflow.com/questions/283299
复制相似问题