各种压缩软件程序的有趣行为
Interesting behavior of various compression software programs
我正在尝试压缩一个 64 兆字节的文本文件,其中仅包含 7 个不同的字母,随机分布并且出现频率大致相似。
我注意到 7Zip 和 WinRar 等各种压缩软件程序的一个有趣行为。
两个应用程序都达到了大约 35% 的压缩率。
当文件包含8个不同的字母,也是随机分布,出现频率大致相近时,压缩率小于0.3%!
谁能解释一下?
谢谢。
这只能解释为你用“8个不同的字母”构建文件的方式有误。您用七个不同字母构建的文件看起来是正确的,因为压缩比应该是 log2(7)/8,即 0.351。同样是八个字母,压缩比为log2(8)/8,即0.375.
也许您的文件在八个字母中有重复模式。
更新:
您正在使用 rand()
生成您的“随机”分布。不幸的是,rand()
的经典实现在低位具有 非常 很差的随机性,具有重复模式。您的 % 7
使用了 rand()
中的所有位,但 % 8
仅使用了低三位。 % 8
等同于 & 7
.
改用 random()
,它会生成低位以及任何位都具有良好随机行为的随机数。
我正在尝试压缩一个 64 兆字节的文本文件,其中仅包含 7 个不同的字母,随机分布并且出现频率大致相似。
我注意到 7Zip 和 WinRar 等各种压缩软件程序的一个有趣行为。 两个应用程序都达到了大约 35% 的压缩率。
当文件包含8个不同的字母,也是随机分布,出现频率大致相近时,压缩率小于0.3%!
谁能解释一下?
谢谢。
这只能解释为你用“8个不同的字母”构建文件的方式有误。您用七个不同字母构建的文件看起来是正确的,因为压缩比应该是 log2(7)/8,即 0.351。同样是八个字母,压缩比为log2(8)/8,即0.375.
也许您的文件在八个字母中有重复模式。
更新:
您正在使用 rand()
生成您的“随机”分布。不幸的是,rand()
的经典实现在低位具有 非常 很差的随机性,具有重复模式。您的 % 7
使用了 rand()
中的所有位,但 % 8
仅使用了低三位。 % 8
等同于 & 7
.
改用 random()
,它会生成低位以及任何位都具有良好随机行为的随机数。