我有大量的整数数组。每个整数都有几千个整数,每个整数通常与前一个整数相同或仅相差一两位。我想将每个阵列缩小到尽可能小,以减少磁盘 IO。
Zlib 将其缩小到原始大小的 25% 左右。这很好,但我不认为它的算法特别适合这个问题。有谁知道对于此类信息可能表现更好的压缩库或简单算法?
更新:zlib 将其转换为异或增量数组后,将其缩小到原始大小的 20% 左右。
如果大多数整数确实与前面的相同,并且符号间差异通常可以表示为一位翻转,那么这听起来像是 XOR 的工作。
获取如下输入流:
1101
1101
1110
1110
0110
和输出:
1101
0000
0010
0000
1000
一些伪代码
compressed[0] = uncompressed[0]
loop
compressed[i] = uncompressed[i-1] ^ uncompressed[i]
我们现在已将大部分输出减少到 0,即使高位发生更改也是如此。您使用的任何其他工具中的 RLE 压缩都会对此大有裨益。它在 32 位整数上工作得更好,并且仍然可以对流中弹出的完全不同的整数进行编码。您省去了自己处理位打包的麻烦,因为所有内容仍然是 int 大小的数量。
当你想解压时:
uncompressed[0] = compressed[0]
loop
uncompressed[i] = uncompressed[i-1] ^ compressed[i]
这还有一个优点是它是一个简单的算法,运行得非常非常快,因为它只是异或。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)