所以昨天我问了一个关于压缩整数序列的问题(link),大多数评论都有类似的观点:如果顺序是随机的(或者最差的,数据是完全随机的)那么就必须用log2(k)位稳定值k。我也在本网站的其他问题中阅读了类似的回复。现在,我希望这不是一个愚蠢的问题,如果我采取该序列并将其序列化为一个文件然后我在此文件上运行 gzip 然后我实现了压缩(并且取决于时间)我允许 gzip 运行我可能会获得高压缩率。有人能解释一下这个事实吗?
提前致谢。
答案 0 :(得分:5)
我的猜测是你在随机文件上实现了压缩,因为你没有使用最佳的序列化技术,但没有更多的细节,你就无法回答你的问题。 n个数字在[0,k]范围内的压缩文件是否小于n * log2(k)位? (即,n * log256(k)字节)。如果是这样,gzip是否设法为您生成的所有随机文件执行此操作,或偶尔执行此操作?
让我注意一件事:假设你对我说,“我通过使用uniform_int_distribution(0,255)和mt19937 prng [1]生成了一个随机八位字节的文件。我文件的最佳压缩是什么? “现在,我的回答可能是合理的:“大约80位”。我只需要重现你的文件
用于播种prng的值,很可能是32位整数[2];以及
文件的长度,可能符合48位。
如果我可以重现给定80位数据的文件,那就是最佳压缩。不幸的是,这不是通用的压缩策略。 gzip极不可能发现你使用特定的prng来生成文件,更不用说能够对种子进行逆向工程了(尽管这些事情至少在理论上是可以实现的; Mersenne twister不是一个加密安全的程序。)
另一个例子,通常建议在加密之前压缩文本;结果将比加密后的压缩要短得多。但事实是加密增加了很少的熵;最多,它会添加加密密钥中的位数。尽管如此,结果输出很难与随机数据区分开来,gzip很难压缩它(尽管它经常设法挤出几个位)。
注1:注意:这都是c ++ 11 / boost术语。 mt19937是Mersenne twister伪随机数生成器(prng)的一个实例,其周期为2 ^ 19937 - 1.
注2:梅森捻线机的状态实际上是624个字(19968位),但大多数程序使用较少的位来播种它。也许您使用了64位整数而不是32位整数,但它并没有改变答案。
答案 1 :(得分:3)
如果数据是真正随机的,平均没有压缩算法可以压缩它。但是,如果数据具有一些可预测的模式(例如,如果符号的概率取决于数据中出现的先前k符号),则许多(基于预测的)压缩算法将成功。
答案 2 :(得分:3)
如果我接受该序列并将其序列化为文件然后运行gzip 在这个文件上然后我做了压缩
什么是“它”?如果你随机字节(每个均匀分布在0..255)并将它们提供给gzip或任何压缩器,你可能会在极少数情况下获得少量压缩,但大多数时候你将获得少量扩展。