Skip to content

编码模型

压缩库通常不是单一算法,而是多个阶段组合。理解这些模型有助于读懂 ZSTD、LZMA、BSC、LZ4、zlib 和 Brotli 的差异。

字典与滑动窗口

字典压缩把重复片段表示成“距离 + 长度”。窗口越大,越容易找到长距离重复,但内存占用和查找成本也会增加。

你真正需要关注的不是“有没有字典”,而是“字典怎么找”

  • 有的算法偏向极快的启发式查找,适合低延迟场景。
  • 有的算法愿意花更多 CPU 做更深搜索,以换取更高压缩率。
  • 训练字典和预置字典适合大量相似小文件,但会引入额外的分发和版本管理问题。

熵编码

熵编码根据符号概率分配码长。高频符号使用短码,低频符号使用长码。Huffman 和算术/范围编码都属于这一类思想。

为什么熵编码经常是“最后一公里”

字典匹配或变换阶段负责把数据改造成“更容易压缩的形状”,熵编码再把这些符号分布真正压短。
所以很多压缩库看起来像“一个大算法”,实际更像多阶段流水线。

上下文建模

上下文模型根据前面的字节或状态估计下一个符号的概率。模型越强,压缩率可能越好,但编码速度和内存成本通常更高。

上下文为什么会更慢

因为它不仅在编码字节,还在不断更新“对下一个字节的预测”。这意味着更多状态、更多内存访问、更多分支判断。

块排序与变换

块排序类算法先改变数据排列,让相似上下文集中,再进行后续编码。BSC 这一类算法适合学习“变换 + 编码”的组合思路。

一个常见的简化心智模型

可以把很多压缩算法粗略理解为下面的处理链:

text
输入数据
  -> 重复片段抽取 / 结构变换
  -> 符号重组
  -> 概率建模
  -> 熵编码
  -> 输出格式封装

不同算法的核心差异通常发生在前三步:
“找重复”的方式不同、“建模”的强度不同、“格式封装”的目标不同,最终就形成了非常不同的工程特性。

对照六个算法的理解抓手

算法最适合先抓住的关键词
ZSTD多级别调参、通用型、现代工程平衡
LZMA大窗口、强模型、高压缩率
BSC变换、块排序、离线处理
LZ4极快、简单、热路径友好
zlibDEFLATE、兼容性、广泛部署
Brotli文本、静态字典、Web 分发