哈夫曼树-哈夫曼编码

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

如果需要传输一段文字“BADCADFEED”,可以用二进制编码表示。

这个时候数据编码后是“001000011010000011101100100011”,对方接受后每三位一分进行译码。但是在一段文章中,字母的出现频率肯定有高有低,出现频率高的元素的二进制越短,传输的时候的数据也会越短。如果把上面表格中多余的前导0去掉,例如:B:1,D:11,那么编码之后的二进制的确变短了,但是译码的时候无法知道接受的数据中的11代表两个B还是一个D。

    通过哈夫曼编码可以构造出最优的二叉树-哈夫曼树来确定如何编码。假设

字母

A

B

C

D

E

F

频率(%)

27

8

15

15

30

5

哈夫曼编码的规则就是:

1、先找出权值(频率){30,27,15,15,8,5}最小的两个作为左右子树构造一棵新树。即取5,8构成新树,其结点为5+8=13,如图:

哈夫曼树-哈夫曼编码_第1张图片

2、再把新生成的权值为13的结点放到剩下的集合中,所以集合变成{30,27,15,15,13},再根据1,取最小的两个权值构成新树,如图:

哈夫曼树-哈夫曼编码_第2张图片

3、再依次建立哈夫曼树,如下图:

哈夫曼树-哈夫曼编码_第3张图片

4、带入对应的字符,左分支为0,右分支为1。

哈夫曼树-哈夫曼编码_第4张图片

对字母用其从树根到所在叶子所经过路径的0或1来编码,可以得到下表:

字母

A

B

C

D

E

F

二进制字符

01

1001

101

00

11

1000

对比一下两种编码方式:大于节约17%的存储或传输成本。

编码中非0即1,长短不等的话其实很容易混淆的,所以若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码称作无前缀编码。

哈夫曼编码是一种无前缀编码。解码时不会混淆。其主要应用在数据压缩,加密解密等场合。如果考虑到进一步节省存储空间,就应该将出现概率大(占比多)的字符用尽量少的0-1进行编码,也就是更靠近根(节点少),这也就是最优二叉树-哈夫曼树。

你可能感兴趣的:(数据结构)