哈夫曼树-哈夫曼编码

本文介绍了哈夫曼编码,它是可变字长编码的一种,依据字符出现概率构造平均长度最短的码字。通过构造哈夫曼树确定编码方式,能实现无前缀编码,解码不混淆。该编码可节约存储或传输成本,主要应用于数据压缩、加密解密等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哈夫曼编码(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进行编码,也就是更靠近根(节点少),这也就是最优二叉树-哈夫曼树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值