Golomb 编码:让数据瘦身的小巧算法

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 编码的位操作优势明显

开发者视角:为什么值得关注?

  1. 参数简单:只需要设置一个 M,不用建频率表
  2. 速度快:编码解码都是 O(1),适合实时场景
  3. 内存占用低:不需要大查找表
  4. 结果确定:每次压缩结果一致,便于测试和复现

什么时候不该用?

如果你的数据是均匀分布或者正态分布,用 Golomb 编码反而可能让文件变大。

通用压缩算法(如 Zstandard、LZMA)在处理任意数据时,通常比 Golomb 更稳妥。

总结

Golomb 和 Rice 编码告诉我们一个道理:真正理解数据特点,才能做出又简单又高效的方案

在 AI 和机器学习压缩大行其道的今天,这个 60 年代的算法依然有它的用武之地——前提是你遇到了它最擅长的几何分布场景。

下次当你发现数据里小值占主导时,不妨考虑一下 Golomb 编码。很多时候,最老的方案反而最合适。

Read in other languages:

RU BG EL CS UZ TR SV FI RO PT PL NB NL HU IT FR ES DE DA EN