【发布时间】:2021-10-22 11:30:00
【问题描述】:
我有一个大小为 664KB 的文本文件(使用 ls -l)。据我了解,不能将文件压缩为小于Shannon Source Coding limit 的任何内容,而不会导致信息丢失。 我在这里使用了一个程序来计算文本文件的平均香农熵(4.36)并将其乘以它的字符数。我得到 371KB。
然后,我使用了据我了解是无损的 bzip2,发现它把文件压缩到 171K。据我了解,没有什么可以压缩小于香农限制而不会丢失信息,那么bzip如何无损压缩比它小的文件呢?我是否遗漏了一些关于操作系统如何编码文件的信息?
The text file I used for this experiment is MIT Classic's The Republic by Plato.
The program I used to calculate shannon entropy is this one。它给了我与我用来交叉检查它的另一个程序相同的结果。
【问题讨论】:
-
如果您所做的只是逐字节对数据进行熵编码,则该限制将适用。但这不是这些算法所做的。他们还对数据执行各种转换,并对结果进行编码。 |例如,考虑 256 字节的线性序列,其值从 0 到 255。(如 0,1,2,3,4...,254,255)。那是什么熵?现在 delta 代码首先(计算连续字节之间的差异) - 你会得到一个 0,然后是很多 1。现在转换后的数据的熵是多少?
-
或者,假设我们有相同的序列连续重复 100 次。一旦前 256 个字节被编码,您可以通过说“重复最后 256 个字节 99 次”来处理其余的字节。这就是基于 LZ 的算法所做的那种转换。
-
要在实践中看到这一点,请尝试随机打乱文件中的字符并测量压缩后的大小(甚至多次)。
标签: algorithm unix compression