技术

PPM 预测模型原理:用上下文猜下一个字节

📅 2026-08-06 · ✍️ 闪压技术团队 · ⏱ 6 分钟阅读

为什么压缩要先"猜"下一个字符

压缩算法的本质,是在数据里找出"多余"的东西,然后用更短的方式去描述它。怎么找多余?最常见的思路之一,是先猜

如果压缩器能猜出下一个字符是什么,真实的字符就不再需要写出来,只需要写"猜对了"或者"猜错了,需要纠错"的信息。猜得越准,要写的信息就越少,压缩比就越好。

字典编码(LZ 系列)是这条思路的一种实现 —— 用"过去出现过"作为猜测的依据。熵编码(Huffman / 算术编码)是另一种实现 —— 用"哪些字符出现得更频繁"作为依据。PPM(Prediction by Partial Matching)走的则是第三条路:用最近的几个字符作为上下文,统计它在历史上后面最常跟哪些字符

PPM 的核心想法:用"刚刚说了什么"猜"接下来会说什么"

日常说话时,我们其实一直在做 PPM 模型在做的事。

  • 听到"今天天",后面大概率是"气"
  • 听到"压缩算",后面大概率是"法"
  • 听到"打开窗",后面大概率是"口"

这些都是用上一两个字来预测下一个字。语言里这种规律极强,所以基于上下文的预测非常准。

PPM 把它搬到字节流上:

  1. 维护一张表,记录每种"最近 N 个字节的组合"后面跟过哪些字节、出现了几次
  2. 编码下一个字节时,先查最长上下文(比如最近 5 个字节),看历史上下一个最可能是什么
  3. 算一个概率分布,丢给后端的算术编码器去编码

算术编码会按这个概率,把高概率字符编得很短、低概率字符编得长。这样整体字节数就降下来了。

上下文阶:从短到长逐级回退

理论上上下文越长,预测越准。但有两个问题:

  • 上下文越长,组合数越多,稀疏性越严重 —— 大部分组合历史上根本没出现过
  • 存储和查表成本指数级上升

PPM 的优雅之处在于多阶混合:同时维护 1 阶、2 阶、3 阶...N 阶的统计表。

编码时:

  • 先看 N 阶上下文,能匹配就用 N 阶的概率
  • 匹配不上,回退到 N-1 阶
  • 直到 1 阶(只看上一个字符)
  • 全部回退完,还有"没见过"的兜底字符

这种escape 机制(转义符 + 回退)让 PPM 既能利用长上下文的精准度,又不会被稀疏性卡死。解码端按相同规则回退,就能恢复原文。

PPM 在压缩工具栈中的位置

从压缩工具的实现看,PPM 通常不是单独存在,而是嵌在一段流水线里:

输入数据 → 预处理(BWT / ST / MTF) → PPM 上下文建模 → 算术编码(Range Coder) → 字节流

预处理是为了把重复的字节聚到一起,让 PPM 的上下文预测更准 —— 比如 BWT 变换后,相似的字符串片段会集中出现,这正是 PPM 最擅长压的数据形态。

也就是说,PPM 真正擅长的是高度可预测的文本型数据:源码、文献、配置文件、日志、结构化文档。这一类数据上 PPM 系压缩率往往非常可观。

反过来,已经高度压缩或随机化的数据(JPEG、H.264、加密数据)对 PPM 几乎"无感"——上下文没有可学规律,只能靠 0 阶频率硬扛,优势就消失了。

PPM 与字典编码的本质区别

LZ77/Zstandard 这类字典编码,看的是"远期重复"——文件前面出现过的串,后面又来了,就记一个回退指针。它们的预测依据是整篇文档里的复读率

PPM 看的是局部上下文规律。即使两个完全一样的长串在文件里只出现一次,但它们各自的"上下文"如果高度相似,PPM 也能压出来一部分。

可以这样直觉地理解:

  • 字典编码擅长压"反复出现的整段话"
  • PPM 擅长压"每次说法略有不同、但语法高度一致的自然语言"

这也是为什么在文本类压缩场景下,PPM 系列经常与 LZ 系列打得有来有回:它们压的是不同维度的冗余。

PPM 的代价:为什么不是所有工具都用它

听起来 PPM 这么能打,为什么 7-Zip、Zstandard 这类主流工具默认不直接用 PPM?

主要是三个工程成本:

  • 内存占用高:多阶统计表非常吃内存,阶数越高越夸张,大文件时常常需要外部存储
  • 速度偏慢:逐字节算概率、查表、回退、escape,CPU 指令密度比字典编码高不少
  • 生态依赖:PPM 通常需要搭配 Range Coder 类的算术编码器,实现复杂度比 Huffman 高一截

所以现代主流压缩工具一般这样分工:

  • LZ77 + Huffman → 通用、好实现、速度快(DEFLATE / ZIP)
  • LZ77 + 熵编码 + 字典链 → 速度与压缩率兼顾(Zstandard、7-Zip 的 LZMA)
  • BWT + PPM + 算术编码 → 追求极致压缩率,代价是时间和内存

选哪个,本质是压缩率 vs 速度 vs 内存的三选一。

写在最后:理解 PPM,理解压缩的下半程

看懂了 PPM,你会意识到,压缩不止是"找重复"。

它其实在做两件事:先理解数据的统计规律,再用尽可能短的编码把这些规律表达出来

字典编码擅长"看见重复就用",熵编码擅长"把短码留给常见字符",PPM 擅长"按场景给每个字符算一个专属概率"。三条思路彼此并不矛盾——DEFLATE 是 LZ77 + Huffman 的组合,后来很多工具又把 BWT、PPM、Range Coder 拼成更深的流水线。

理解这些零件,再去看任何压缩工具的"压缩模式"选项——快速压缩、平衡模式、画质优先——就不再是黑盒了:它们本质上就是在不同流水线之间切换,并调整每一段参数

打开闪压的文件压缩或图片压缩功能,在不同预设之间来回切一下,你会直观感受到这些底层原理的差异。下次选压缩工具时,也不再会被各种玄学参数绕晕。

相关阅读

标签

技术PPM预测模型上下文建模算术编码字典压缩熵编码文件压缩压缩算法

喜欢这篇?下载闪压试试

完全免费 · 本地处理 · 无广告

立即下载闪压
客服