哈夫曼编码

概念

哈夫曼编码是一种字符编码方式,是可变长编码的一种,1952年提出,依据字符在文件中出现的频率来建立一个用0,1串表示各字符使平均每个字符的码长最短的最优表现形式。

应用于图像压缩和大容量存储

为了正确解码,可变长编码必须满足,二元前缀码的性质任何字符的代码都不能作为其他字符代码的前缀
非前缀码的例子
a:001, b:00,c:010,d:01

解码的歧义,例如字符串0100001
解码1:01,00,001 d, b, a
解码2:010,00,01 c,b,d

前缀码的二叉树及权值

在这里插入图片描述

哈夫曼编码的设计思想

  • 以字符的使用频率做权构建一棵哈夫曼树,然后利用哈夫曼树对字符进行编码,称为哈夫曼编码
  • 具体是将所要编码的字符作为叶子节点,该字符在文件中的使用频率作为叶子节点的的权值,以自底向上的方式、通过执行n-1次的“合并”运算后构造出最终所要求的树,即哈夫曼树,它的核心思想是让权值大的叶子离根最近
  • 采用的贪心策略:每次从树的集合中取出双亲为0权值最小的两棵树作为左、右子树,构造一棵新树,新树根节点的权值为其左右孩子节点权值之和,将新树插入到树的集合中

实例

对下图 a、b、c、d、e、f 六个字符进行哈夫曼编码
在这里插入图片描述

第一次:

在这里插入图片描述
下一步:
在这里插入图片描述
下一步:
在这里插入图片描述
下一步:
在这里插入图片描述
下一步:

在这里插入图片描述
一共2n-1个节点,合并了n-1次

最终结果:
在这里插入图片描述

伪代码

在这里插入图片描述

  • 28
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coderzpw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值