![ent程序如何计算“最佳压缩”?](https://linux22.com/image/194010/ent%E7%A8%8B%E5%BA%8F%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E2%80%9C%E6%9C%80%E4%BD%B3%E5%8E%8B%E7%BC%A9%E2%80%9D%EF%BC%9F.png)
这耳鼻喉科程序可以在文件上运行以提供如下输出:
熵 = 每字节 4.731183 位。
最佳压缩会将这个 15731 字节文件的大小减少 40%。
15731 个样本的卡方分布为 235086.62,随机超过该值的次数小于 0.01%。
数据字节的算术平均值为 87.3796(127.5 = 随机)。 Pi 的蒙特卡罗值为 4.000000000(误差 27.32%)。序列相关系数为 0.140065(完全不相关 = 0.0)。
程序如何确定“最佳压缩”可以实现什么?
我注意到,即使 gzip 也通常会超过这个估计值。
答案1
熵给出了文件中包含的信息的多样性,IE文件中存在的不同值的数量的表示;最佳压缩,或者更准确地说,最佳编码,将恰好使用该存储量。
在您的情况下,该文件当前长度为 15,731 字节,但每字节存储 4.731183 位;因此它总共包含 4.731183 × 15,731 位信息,IE74,426.24 位信息,或 9,303.28 字节。最佳压缩将产生 9,304 字节的文件,这是原始文件的 59.14%。可以在不参考文件长度的情况下完成相同的计算:4.733183 是 8 的 59.16%。用缩减表示,(8 - 4.733183) 是 8 的 40.84%,并且这是执行的计算ent
,将百分比截断为整数:
printf("Entropy = %f bits per %s.\n", ent, samp);
printf("\nOptimum compression would reduce the size\n");
printf("of this %lld %s file by %d percent.\n\n", totalc, samp,
(short) ((100 * ((binary ? 1 : 8) - ent) /
(binary ? 1.0 : 8.0))));
现实世界的压缩工具通过以更简洁的方式表示重复来克服这个问题。比较结果
$ (printf %5000s; printf %5000s | tr ' ' '1') | ent
Entropy = 1.000000 bits per byte.
Optimum compression would reduce the size
of this 10000 byte file by 87 percent.
$ (printf %5000s; printf %5000s | tr ' ' '1') | gzip | wc -c
48
输入由大量字节组成,但只有两个不同的值,且数量相等,因此熵为每字节 1 位。ent
认为输入可以使用每字节 1 位进行编码,IE减少八倍。gzip
然而,它代表了空格和个的运行,并且生成的文件即使带有gzip
标头也小了 208 倍。