压缩的极限:万能压缩器为什么是数学骗局

任何声称「任意文件、越压越小」的软件,数学上等价于永动机。选一个文件,不停点「再压一次」,亲眼看着它第二轮就开始膨胀;最后再运行那个「压缩成功率 100%」的万能压缩器,看鸽笼原理当场拆穿它。

$ gzip novel.txt       7,016 B -> 3,198 B   又小了 54.4%
$ gzip novel.txt.gz    3,198 B -> 3,221 B   开始膨胀
$ gzip novel.txt.gz.gz 3,221 B -> 3,244 B   每层 +23B 格式税
# 第 2 轮起,gzip 开始反向工作。这不是 bug,是数学。

第一步:选一个文件当实验品

四个文件,四种命运。先在心里猜一猜谁最耐压、谁一点就瘪,再点卡片验证。

压缩实验台

每点一次「再压一次」,就给当前文件再套一层 gzip。盯住三个读数:大小、上一轮变化、熵。熵走到 8.00,说明信息已经塞满,一个比特都压不掉了。

compress-lab -- bash
当前大小
-
已压轮数
0
累计变化
-
上一轮变化
-
熵(信息密度) - / 8.00 bits/byte
熵 = 字节分布的混乱度。低 = 字节大量重复,一压就瘪;8.00 = 与随机数据无异,压缩算法无从下手。
文件预览
字节内容(hexdump,每轮更新)

          
# 每轮压缩后的文件大小曲线 -- 看它何时掉头向上

彩蛋:我的万能压缩器

把上面正在实验的文件压成 1 个字节。压缩成功率 100%,童叟无欺。至于还原嘛……先别问。

四条原理,一堵墙

为什么「越压越小」注定失败?答案不需要微积分,只需要数鸽子。

01

鸽笼原理:压缩的上限是数出来的

2 字节文件有 65,536 种取值,1 字节只有 256 种。想把前者的每一种都映到后者,至少 65,280 个文件必须共享同一个压缩结果--解压器无法区分它们。这不是工程难题,是计数问题:球比洞多,就必然挤。

02

可压缩性 = 冗余 = 规律

文本能压一半,是因为语言满是规律:q 后面几乎总是 u,常见词反复出现。照片压不动,是因为 PNG/JPEG 编码时已经把冗余吃干净了。随机数据一个比特都压不掉,因为它本来就没有规律。压缩算法不是在「变魔术」,是在「找规律」。

03

格式税:压不动还要倒贴

gzip 每套一层要交约 18~40 字节 的固定开销(文件头 + 校验和 + 存储块记账)。对压不动的数据,这笔税全额照收--这就是实验台里第二轮之后曲线缓慢上翘的原因。「压缩后的文件再压缩」稳赔不赚。

04

历史一直在重播这个骗局

2002 年美国公司 Zeosync 宣称「突破了压缩极限」,拿融资上新闻,随后在技术圈的笑声中蒸发;荷兰发明家 Sloot 声称能把整部电影存进 8KB,源码在签约前夜随他一起消失。骗局的演示永远用文本和表格,永远不敢当众压缩一段掷硬币得到的随机数。

一句话记住

压缩的本质是把规律改写成短代码。规律是燃料,烧完就没了;随机是灰烬,谁也压不动它。任何「万能」压缩器的正确名字都叫:有损压缩 + 说谎的还原器。