频率决定怎样分配码长

固定长度编码给每个符号同样多的位,即使某些符号远比其他符号常见。Huffman编码利用频率差异,允许不同符号码字长度不同;计算目标是各符号出现次数乘以码长后的总和。

码字还要能够无歧义地接在一起。算法把符号放在二元树叶子,从根到叶的0、1路径成为码字,因此任何完整码字都不再延伸成另一个符号的前缀。短码字收益与树的整体约束需要同时满足。

参考:[1] [2]

反复合并权重最小的两棵树

构造从每个出现过的符号各一棵树开始,以频数为权重。每轮取权重最小的两棵树,建立一个新父节点,权重为两者之和,再放回候选集合;只剩一棵树时,便得到完整编码树。优先队列可支持反复取出最小项。

越晚与其他子树合并的符号,往往处在较浅位置。并列频率可以产生不同的同样最优码表,左右分支互换也会改变比特串而不改变码长;解码要求双方知道同一棵树,不能只凭“都用了Huffman”猜测码字。

参考:[1]

最优结论与文件开销的范围

对给定符号权重,Huffman给出逐符号二元前缀码的最小加权路径长度。若数据中还有跨符号的上下文或长片段重复,其他建模及编码办法仍可能进一步利用;不能把这一受限最优结论推广为任何输入上的最佳压缩。

实际文件还需让解码者取得树和消息结束信息。Princeton示例把树及原始字节数写入输出,随后按树逐位解码。短消息的这些开销可能超过节省的主体位数,压缩收益必须按完整表示统计。

参考:[1] [2]