问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

哈夫曼树-哈夫曼编码

创作时间:
作者:
@小白创作中心

哈夫曼树-哈夫曼编码

引用
CSDN
1.
https://m.blog.csdn.net/gakki_wpt/article/details/92831664

哈夫曼编码是一种广泛应用于数据压缩领域的编码方式,它通过构建最优二叉树(哈夫曼树)来实现数据的高效编码。本文将详细介绍哈夫曼编码的基本原理、构建过程及其在数据压缩中的应用。

哈夫曼编码(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,如图:

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

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

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

对字母用其从树根到所在叶子所经过路径的0或1来编码,可以得到下表:
字母 A B C D E F
二进制字符 01 1001 101 00 11 1000

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

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

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号