编码 | 解码 | 压缩

> 算术编码 | 分数位 | 最优 <

// 算术编码 - 使用分数比特接近信息熵极限的编码

[OPTIMAL]

接近最优

压缩效率接近理论上的信息熵极限。

[FRACTIONAL]

分数位比特

根据符号概率使用分数位比特进行编码。

[STREAMING]

流式处理

可以在数据到达时逐步编码和解码。

>> 技术说明

算术编码的工作原理:

算术编码将整条消息表示为区间 [0,1) 内的一个数。每个符号根据自身概率不断收缩该区间。最终得到的区间再被编码为二进制小数,从而实现非常接近熵极限的压缩率。

编码过程示例:

文本: "AAB" 概率: A=0.67, B=0.33 1. 起始: [0, 1) 2. 'A': [0, 0.67) 3. 'A': [0, 0.45) 4. 'B': [0.30, 0.45) 输出: [0.30, 0.45) 区间内的任意数 二进制: 0.010011...

为什么选择算术编码:

  • >更高的压缩比
  • >接近信息熵极限
  • >支持任意概率分布
  • >用于 JPEG2000 / H.264 等标准
  • >相关专利已到期(2024)

>> 常见问题

什么是算术编码?

算术编码是一种熵编码方式,会把一串符号转换为一个分数值。与只使用整比特的 Huffman 编码不同,算术编码可以为每个符号分配分数比特。

它为什么比 Huffman 更好?

算术编码可以实现任意接近熵极限的压缩,而 Huffman 编码受限于每个符号必须使用整数个比特。对于概率分布高度不均匀的场景,算术编码的效果通常好得多。

精度参数是什么意思?

精度控制内部计算使用的比特数。更高的精度可以编码更长的消息,但会占用更多内存。对于短文本,一般 16 位精度就足够。

算术编码常用于哪些地方?

算术编码广泛应用于 H.264/H.265 视频、JPEG2000 图像以及 ZIP 的 DEFLATE64 模式等现代压缩标准。过去曾受专利限制,但关键专利已经到期。

// 计算示例

StepSymbollowhigh
0—01
1A00.5
2B0.250.375
3C0.343750.375

// 代码示例

Model     P(A)=0.5  P(B)=0.25  P(C)=0.25   ->  A:[0,0.5)  B:[0.5,0.75)  C:[0.75,1)
Update    width = high - low
          high  = low + width * cum_high(symbol)
          low   = low + width * cum_low(symbol)
Output    any value in [0.34375, 0.375)  e.g. 0.34375 = 0.01011b  (5 bits = 1 + 2 + 2)
Entropy   -log2 P(A) - log2 P(B) - log2 P(C) = 1 + 2 + 2 = 5 bits

>> 更多问题

问:为什么算术编码通常比霍夫曼编码更好?

答:霍夫曼为每个符号分配整数个比特(至少 1 位)。算术编码把整条消息编码为 [0, 1) 内的一个分数,接近熵极限,即使概率超过 50% 的符号在霍夫曼下也要占 1 位。

问:ABC 区间示例是怎么算的?

答:设 A=0.5、B=0.25、C=0.25,每个符号都会缩小区间:[0,1) → [0,0.5) → [0.25, 0.375) → [0.34375, 0.375)。区间内任一数,如二进制 0.01011(=0.34375),就能用 5 位编码“ABC”,恰为熵。

问:算术编码用在哪里?

答:用于 H.264/HEVC 的 CABAC、JPEG 2000 与 JBIG2 的 MQ 编码器,以及 range coding(AV1)和 ANS(zstd、JPEG XL)等变体。早期专利曾阻碍普及,现在大多已过期。

其他语言