1. 概述
哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。
哈夫曼编码是可变字长编码(VLC)的一种。 Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就称Huffman编码。
2. 举例
已知某文档包含5个字符,每个字符出现的频率如下表所示。采用哈夫曼编码对文档进行压缩:
字符 | a | b | c | d | e |
---|---|---|---|---|---|
频率(%) | 40 | 10 | 20 | 16 | 14 |
构建哈夫曼树:
原则,每次取剩余元素中最小的两个构成一棵新树,并将权值(频率)之和作为新权值放入。重复此过程,直至只剩一棵树,即为哈夫曼树
译码的惟一性问题:
要求任一字符的编码都不能是另一字符编码的前缀,这种编码称为前缀编码(其实是非前缀码)。 在编码过程要考虑两个问题,数据的最小冗余编码问题,译码的惟一性问题,利用哈夫曼树可以很好地解决上述两个问题
用哈夫曼树设计二进制前缀编码:
以电文中的字符作为叶子结点构造二叉树。然后将二叉树中结点引向其左孩子的分支标 ‘0’,引向其右孩子的分支标 ‘1’; 每个字符的编码即为从根到每个叶子的路径上得到的 0, 1 序列。如此得到的即为二进制前缀编码。
字符 | a | b | c | d | e |
---|---|---|---|---|---|
频率(%) | 40 | 10 | 20 | 16 | 14 |
前缀编码 | 0 | 100 | 101 | 110 | 111 |
3. 例题
使用上述哈夫曼树编码:
① 单词"cade"的编码为?
对应c的编码为111,a的编码为0,d的编码为110,e的编码为101
所以,单词"cade"的编码:1110110101
② 文档的压缩比是多少?
- 压缩前,表示5个不同的字符,用二进制编码至少需要3位二进制,即每位字符占据空间3bit,平均编码长度为:3×40%+3×10%+3×20%+3×16%+3×14%=3
- 压缩后,表示5个不同的字符,编码长度分别为1、3、3、3、3,平均编码长度为:1×40%+3×10%+3×20%+3×16%+3×14%=2.2
压 缩 比 = 3 − 2.2 3 × 100 % = 27 % 压缩比 = {3 - 2.2 \over 3} × 100\% = 27\% 压缩比=33−2.2×100%=27%