为什么引入Huffman编码:

计算机中的字符是用二进制编码来表示的。我们可以使用定长编码,例如,对下表的每个字符赋予一个长度为3的二进制的比特串。
图片说明
但是,为了减少存储空间,我们通常需要对文件进行压缩。为了产生平均长度更短的文本编码,更优的编码方案是把较短的比特串分配给更常用(频率高的)的字符,把较长的比特串分配给较不常用(频率低的)的字符。
图片说明

举个例子:

一个包含100,000个字符的文件,定长编码需要300,000位。
按变长码编码方案,文件的总码长为: (45×1+13×3+12×3+16×3+9×4+5×4)×1000=224,000。
使用变长码编码方案比用定长码编码方案总码长减少约25%。

译码
定长码的译码:
000001000010010011000的译码是:abaccda
a b a c c d a
变长码的译码 :001011101 ?
如何知道编码文本中第几位到第几位代表第几个字符呢?为了解决这个问题,前缀码被引入。


前缀码:

对每一个字符规定一个0,1串作为其代码,并要求任一字符的代码都不是其他字符代码的前缀。这种编码称为前缀码。
图片说明
变长码的译码 :001011101可以译码为aabe。
译码过程:0:回到表格找0,返回a--> 0:返回a--> 1:找不到--> 10:找不到--> 101:返回b--> 1:找不到-->...--> 1101:返回e.