哈夫曼树/哈夫曼编码

产生

假如我们现在要向朋友发送一条数据,这条数据会变成二进制的字节流(01010011101)

我们都了解过ASCII码:在人类没有发明计算机前,人们用电报发送信息,电报发送的是长短不一的信号,在谍战剧中,通常会抢一个密码本,他就告诉了我们每一个长信号短信号代表了什么意思(一个翻译工具

 

随着计算机的发展,为了使该技术得到推广,美国设置了一套公用的密码本ASCII码。如今,国际通用密码本为utf-8.

我们发送信息 i love you 转化为ASCII码的二进制使用了80比特流,那么有没有办法对它进行压缩呢?我们知道,一个数组中的存储是按照固定长度进行截取的,可若我们知道每个信息的长度,按照不固定的长度进行截取,就可以进行压缩

我们用变长编码格式发送i love you,首先统计字母出现的次数

 

这样得出来的编码就是0101011110001011110,当前数据为19个比特,若利用ASCII编码用了80比特,压缩率达到了75%以上。

同样也会产生问题,再接收信息的一方截取产生错误时,会读取到错误的信息。这就是不定长编码的问题。

所以我们想要压缩,就要使用不定长压缩,但是会产生信息读取错误的问题。为了解决这个问题,孤儿产生了哈夫曼编码。

哈夫曼树

首先我们要了解几个概念

(1)带权路径长度:从根节点到该节点所经过的路径长度与该节点的权的长度

(2)树带权路径长度:从根节点到所有叶子节点所经过的路径长度与该节点的权的乘积之和(成为WPL)

(3)WPL最小的数就是哈夫曼树。

 

构建哈夫曼树,要把小值放在下面,大值放在上面

构建一个i love you的哈夫曼码,首先要构建一个哈夫曼树

 

 

 

 

 

然后编译哈夫曼码

 

这样得到的编码有了大约50%的压缩率,但这样就解决了读取错误的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值