哈夫曼编码
问题描述
字符 | A | B | C | D | E |
---|---|---|---|---|---|
出现概率 | 0.35 | 0.1 | 0.2 | 0.2 | 0.15 |
如上图所示,要发送一串编码,有100个字符,分别是A, B, C, D, E,所占比例也如图所示。
假设:编码规则如下
字符 | A | B | C | D | E |
---|---|---|---|---|---|
编码规则 | 000 | 001 | 010 | 011 | 100 |
问题提出:我们用三位来表示一个字符(因为两位最多表示四个字符),我们想让传输编码的速度更快,在其它条件不变的情况下,我们就减少内存的大小。
分析:为了减少内存的大小,我们就减少字节的位数,但是我们得考虑减少位数会不会产生歧义,例如:假设A的编码是00,E的编码是100,发送AE,以二进制的形式传输,收到之后为00100,这时候得进行解码,可是是解码成BA还是AE,这个时候就产生了歧义,为了解决这个歧义,我们得构造哈夫曼树。
问题的解决:首先我们看到第一张表,我们要使内存更小,就要让出现频率大的字符位数变小。所以我们开始构建哈夫曼树。
第一步:将字符的概率按从小到大排序
B | E | C | D | A |
---|---|---|---|---|
0.1 | 0.15 | 0.2 | 0.2 | 0.35 |
第二步:将前两个字符合并后再排序,于是就有树的如下构造
第一步
第二步
第三步
第四步
第五步
得到哈夫曼树之后,我们左侧编0,右侧编1,所以得到哈夫曼编码
字符 | A | B | C | D | E |
---|---|---|---|---|---|
哈夫曼编码 | 11 | 000 | 01 | 10 | 001 |
这样的话我们就解决了内存的问题与歧义