在算术编码中,确定最终二进制表示的位数,需要确保编码后的数值,能唯一标识输入消息对应的区间。
1. 确定区间长度
假设最终编码区间为[L, H),其长度为H - L。
关键公式:所需位数n 满足:
解不等式得:
取最小整数n,确保二进制精度足以唯一标识该区间。
2. 二进制表示的最短性
步骤说明:
(1)将区间端点转换为二进制小数
例如:区间 [0.3125, 0.375)
0.3125= 0.0101 0000……(后面全为0)
0.375 = 0.011 0000……(后面全为0)
(2)寻找最短公共前缀
观察两个二进制数的公共前缀:
0.0101...
0.011...
公共前缀为0.01,之后出现分歧:低端为01,高端为1。
低端(L):在第四位为 0 后仍有有效位(1),即二进制展开更“长”
高端(H):在第四位为 1 后无有效位,直接终止
(3)确定最短有效位数
在公共前缀后添加尽可能少的位,使数值落在区间内。
本例中,选择 0.011(十进制 0.375)会超出高端,因此需选更小的值:
最短候选:0.0101(4位,十进制 0.3125),但需检查是否在区间内。
实际结果:区间包含左端点,因此0.0101是有效的最短二进制数。
3. 进位处理
当区间端点不是精确的二进制分数时,需处理进位:
(1)示例:区间 [0.3, 0.4)
转换为二进制:0.3 ≈ 0.01001101,0.4 ≈ 0.01100110
最短候选:0.011(3位,十进制 0.375),验证其在区间内(0.3 ≤ 0.375 < 0.4),满足条件。
4. 实际编码中的优化
动态缩放:在编码过程中逐步输出已确定的二进制位,减少最终位数。
例如:当区间缩小到[0.5, 1) 时,直接输出 1,并重新映射区间为[0, 1)。
终止位:添加一个额外的终止位(如 1)表示结束,避免歧义。
此过程也可以通过Python代码实现
import math
def arithmetic_coding_bits(low, high):
# 计算区间长度
interval_length = high - low
# 计算所需最小位数
n = math.ceil(math.log2(1 / interval_length))
return n
# 示例:区间 [0.3125, 0.375)
low = 0.3125
high = 0.375
bits = arithmetic_coding_bits(low, high)
print(f"所需最少位数: {bits} 位")