编码模型
压缩库通常不是单一算法,而是多个阶段组合。理解这些模型有助于读懂 ZSTD、LZMA、BSC、LZ4、zlib 和 Brotli 的差异。
字典与滑动窗口
字典压缩把重复片段表示成“距离 + 长度”。窗口越大,越容易找到长距离重复,但内存占用和查找成本也会增加。
你真正需要关注的不是“有没有字典”,而是“字典怎么找”
- 有的算法偏向极快的启发式查找,适合低延迟场景。
- 有的算法愿意花更多 CPU 做更深搜索,以换取更高压缩率。
- 训练字典和预置字典适合大量相似小文件,但会引入额外的分发和版本管理问题。
熵编码
熵编码根据符号概率分配码长。高频符号使用短码,低频符号使用长码。Huffman 和算术/范围编码都属于这一类思想。
为什么熵编码经常是“最后一公里”
字典匹配或变换阶段负责把数据改造成“更容易压缩的形状”,熵编码再把这些符号分布真正压短。
所以很多压缩库看起来像“一个大算法”,实际更像多阶段流水线。
上下文建模
上下文模型根据前面的字节或状态估计下一个符号的概率。模型越强,压缩率可能越好,但编码速度和内存成本通常更高。
上下文为什么会更慢
因为它不仅在编码字节,还在不断更新“对下一个字节的预测”。这意味着更多状态、更多内存访问、更多分支判断。
块排序与变换
块排序类算法先改变数据排列,让相似上下文集中,再进行后续编码。BSC 这一类算法适合学习“变换 + 编码”的组合思路。
一个常见的简化心智模型
可以把很多压缩算法粗略理解为下面的处理链:
text
输入数据
-> 重复片段抽取 / 结构变换
-> 符号重组
-> 概率建模
-> 熵编码
-> 输出格式封装不同算法的核心差异通常发生在前三步:
“找重复”的方式不同、“建模”的强度不同、“格式封装”的目标不同,最终就形成了非常不同的工程特性。
对照六个算法的理解抓手
| 算法 | 最适合先抓住的关键词 |
|---|---|
| ZSTD | 多级别调参、通用型、现代工程平衡 |
| LZMA | 大窗口、强模型、高压缩率 |
| BSC | 变换、块排序、离线处理 |
| LZ4 | 极快、简单、热路径友好 |
| zlib | DEFLATE、兼容性、广泛部署 |
| Brotli | 文本、静态字典、Web 分发 |