“算术编码区间把已知或共同预测的条件概率逐步变成嵌套区间;有限精度实现另行承担整数舍入、延迟位和终止。二者接在本页熵界之后,而不是把渐近存在性换成任意短文件必然变小的承诺。完整文件实验把模型表…”
形式陈述
理想算术编码的半开实数区间会不断缩小。这里改用
这两式都用旧
缩区间后,按以下优先顺序反复重归一化。
- E1:
。发0,再发 个1,清零 - E2:
。发1,再发 个0,清零 ;端点都减 - E3:
且 。 加一,暂不输出;端点都减
命中任意一种后都令
译码器先读
找到唯一
直觉
E1与E2在两端的最高位相同时送出这个确定的位。E3处理两端分跨1/2、却都落在中间一半的情况。例如8位区间
为什么补相反位?归一化实数映射E3是 01…;若从1开始,原来应输出 10…。连续E3把这一义务叠加;后来的E1/E2一旦决定主位,就能一次发出所有反位。这里的underflow是区间挤在中点附近,和浮点数小到变零是不同机制。
例子与边界
仍用 ABABA EOF每步的“缩后区间 → 操作 → 归一化后区间;累计输出”如下:
- A:
;0 - B:
;01 - A:
;010 - B:
, ;仍是010 - A:
,发0及一个反位1;01001 - EOF:
, ;010011
flush把 0111,得到 0100110111。再接8个零guard、6个字节填充零,负载字节为十六进制 4d c0 00。不要把全部24个位都当成算术有效码字:有效码10位,guard8位,字节填充6位。
译码初始取 01001101,故
推论与应用
可译性与频数界
归一化停止时
译码scaled公式恰好反解“01 及后续零可落入其中;否则必有 10 可用。flush把此前延迟反位一起兑现,正好选定对应前缀。
若编码全程归一化总次数为
完整帧还检查声明的原字节数、有效位数和零guard。教学解码器额外重编码已恢复的文本,要求有效位与规定flush完全一致,以拒绝另一种结束写法或被改短的有效位声明;这增加一遍编码工作,却不是密码学完整性验证。有限文件里的bit翻转仍可能把一个合法文件变成另一合法文件。
同样约束寄存器大小的rANS改用单一整数状态和位数栈:它逆序编码、编码前提取位数,译码后补入;本页则前向缩区间并处理E1/E2/E3。两种有限实现各有自己的归一化逆关系和结束协议,不能把本页的EOF、guard或flush直接套到rANS。
参考资料
- I. H. Witten、R. M. Neal、J. G. Cleary,Arithmetic Coding for Data Compression,1987,Figure3、pp.523–529的编码/译码程序与pp.532–535的整数正确性分析。本页采用升序累计表和MSB-first封装,原文表方向及字节打包不原样照搬
- 本单元检查器:状态生成、独立枚举子区间逆解、空串/单字母与截断用例;教学格式定义不称为DEFLATE