← Huffman 编码树 · 拆解 huffman coding / prefix code 与解码:为何唯一可解 待审核 3 / 6
prefix-free · 走树解码

prefix code 与解码:为何唯一可解

variable-length code 有一个直接的问题:codeword 长短不一,中间又不加分隔符,解码器必须能确定一个 codeword 到哪里结束、下一个从哪里开始。Huffman code 天生是 prefix code (prefix-free)没有任何一个字符的 codeword,是另一个字符 codeword 的前缀,因此边界唯一确定。

之所以天生满足,是因为字符只在叶子上(树由动手建树一页的算法建出)。从根往下走,经过的内部 node 都不是任何字符,只有走到叶子才「落地」成一个字符——而叶子之间互不为祖先,路径自然互不为前缀。于是解码变成一件机械的事:从根开始,读一个 bit 就往左 (0) 或往右 (1) 走一步,一碰到叶子就输出这个字符、回到根,不会有歧义。

1 · 编码:字符 → codeword,首尾相接

把消息里每个字符换成它的 codeword,直接拼起来即可。下面每个字符的 bit 段用深浅交替标出。

2 · 解码:从根逐 bit 下降,到叶子就落地

点「下一步」读入一个 bit,看蓝色路径在树上一步步下降;一旦到达叶子(蓝色实心圈),就输出一个字符并跳回根重新开始。注意:解码过程不需要「往回看」或猜测——走到叶子那一刻就唯一确定了一个字符,这正是 prefix code 的作用。

对照:非 prefix code 的歧义。 假设 a0a\to 0b01b\to 01。收到 0 时解码器无法判断:它可能是一个完整的 a,也可能是 b 的开头,必须依赖后续输入才能确定——这就是歧义。Huffman 把所有字符放到叶子上,从根本上回避了它。