Golomb 编码:让数据瘦身的小巧算法
五月 25, 2026
data-compression algorithms golomb-coding rice-coding optimization backend-development computer-science performance-tuning
理解 Golomb 编码:压缩与数学的结合
数据压缩从来不是“一刀切”的事。gzip、LZ4 这些通用算法在大多数场景下够用,但碰到数据本身就有固定规律时,它们就不一定最优了。
Golomb 编码就是专门用来对付这种规律的。它由 Solomon W. Golomb 在 60 年代提出,至今还在用。
什么数据适合 Golomb 编码?
关键在于数据是否符合几何分布——小数字出现得特别多,大数字很少。
举几个现实例子:
- 网络重试次数:大部分连接第一次就成功了,少数需要重试两次,极少数才要重试十次。
- 视频帧差:相邻帧的差异通常很小。
- 日志里的错误等级:严重错误很少,轻微问题占大多数。
Golomb 编码正是抓住了“小值多、大值少”这个特点,给常用的小值配短编码,少见的大值配长编码,从而达到更好的压缩效果。
它是怎么工作的?
Golomb 编码会根据一个参数 M,把每个数字拆成两部分:商和余数。
- 商用一元编码(一串 0 后面跟一个 1)
- 余数用二进制表示
这种混合方式看似简单,但对几何分布的数据特别高效。
Rice 编码:更实用的版本
后来 Robert F. Rice 对 Golomb 做了个优化,把参数 M 限制为 2 的幂次(2、4、8、16……)。这看似不起眼的一步,带来了巨大好处——计算变成了位操作(移位和掩码),比除法和取模快得多。
所以 Rice 编码在实际项目里更常见,尤其适合对速度要求高的场景。
现在哪些地方还在用?
- H.264 / H.265 视频编码里,用的是 Exp-Golomb(Golomb 的变种)
- 语音压缩算法常用 Rice 编码
- 基因数据处理时,也会用到 Golomb 的变体
- IoT 设备为了省流量,常选 Rice 编码
- 嵌入式系统里,CPU 资源有限,Rice 编码的位操作优势明显
开发者视角:为什么值得关注?
- 参数简单:只需要设置一个 M,不用建频率表
- 速度快:编码解码都是 O(1),适合实时场景
- 内存占用低:不需要大查找表
- 结果确定:每次压缩结果一致,便于测试和复现
什么时候不该用?
如果你的数据是均匀分布或者正态分布,用 Golomb 编码反而可能让文件变大。
通用压缩算法(如 Zstandard、LZMA)在处理任意数据时,通常比 Golomb 更稳妥。
总结
Golomb 和 Rice 编码告诉我们一个道理:真正理解数据特点,才能做出又简单又高效的方案。
在 AI 和机器学习压缩大行其道的今天,这个 60 年代的算法依然有它的用武之地——前提是你遇到了它最擅长的几何分布场景。
下次当你发现数据里小值占主导时,不妨考虑一下 Golomb 编码。很多时候,最老的方案反而最合适。