Huffman 编码

1) 问题引入

Huffman 编码也也是贪婪算法的一种应用,它在文件压缩中有较强的应用。

对于计算机来说,它只认识两个数0,1 。而对于字符,计算机需要对其进行二进制编码来表示。假设对于128个字符,常规的编码方式利用8个位来表示(其中1位为奇偶校验位)。假设我们的文件只有7种不同的字符组成,那么我们需要3个位来表示这7个字符,可以有下面的编码方式:

Huffman 编码_第1张图片

如果我们用等长的位来编码时,我们可以得到一共需要174位的空间。我们可以看到上表中不同的字符的频率是不同的,差别较大,那么如果用较少的位来编码频率较高的字符,用较多的位来编码频率较低的字符,那么最终总的空间是不是会小很多呢?Huffman算法就是解决了这一问题。


2) Huffman算法

a) 把每一个字符看做一棵树,频率作为权值

b) 合并频率较低的两棵树,这样频率较低的树就会在最终的编码树中深度较高。

c) 编码,编码的规则为左子树为0,右子树为1.

下面是上面的例子:

Huffman 编码_第2张图片

因此得到的最终的编码结果为

Huffman 编码_第3张图片


3) 讨论

值得注意的是,并不是所有的情形都适合用Huffman编码。因为在文件前,需要发送一个编码表来使接受方能够解码出内容,这也会占据一定的空间,尤其是需要编码的内容不多时,编码表会占比较大,同时利用Huffman需要首先扫描内容,得到字符的频率,然后在进行编码,因此比较费时。


你可能感兴趣的:(Huffman 编码)