我正在存储10,000 uint64s的数组。这些值是哈希值,因此非常均匀地分布在整个64位空间中,这使得它们不适合压缩(zip只能节省大约3%)。
但是,值的顺序并不重要。我可以使用这些额外的知识来制作更有效的压缩程序吗?一个直接的想法是按顺序对它们进行排序,然后对它们进行bucketize,例如"接下来x值都有前缀a1b2c3"或者其他的东西。这肯定可以改善拉链,但我可以做得更好吗?谢谢
答案 0 :(得分:2)
你可以得到的理论上最好的好处是log2(10000!)位,这比你的初始80K字节大约15K字节。减少不到20%。
如果你真的想尝试挤出大部分内容,你可以尝试按排序顺序压缩连续哈希之间的差异。第一个哈希将按原样发送,然后是9,999个差异。我将每个64位差异的高12位分离成不同的块,并用标准的无损压缩器压缩它。每个散列差异的低52位基本上都是噪声,因此不按原样发送,而不试图压缩它。
您可以使用数字12来查看最适合压缩的内容。也许11或13会更好。