huffman树_数据结构(五):赫夫曼树与赫夫曼编码

一、赫夫曼树

在数据膨胀、信息爆炸的今天,数据压缩的意义不言而喻。谈到数据压缩,就不能不提赫夫曼(Huffman)编码,赫夫曼编码是首个实用的压缩编码方案,即使在今天的许多知名压缩算法里,依然可以见到赫夫曼编码的影子。

另外,在数据通信中,用二进制给每个字符进行编码时不得不面对的一个问题是如何使电文总长最短且不产生二义性。根据字符出现频率,利用赫夫曼编码可以构造出一种不等长的二进制,使编码后的电文长度最短,且保证不产生二义性。

以下程序在效率上有什么问题呢?

4f7207c3a900039cba35d9338cf64d7c.png

程序流程图.png

如果我们把判断流程改为以下,效果可能有明显的改善:对于判断良好效率更高了。

6a07db2d937dc02b57e2bdc3b96c9807.png

改进版流程图.png

赫夫曼树定义与原理

把这两棵二叉树简化成叶子结点带权的二叉树
(注:树结点间的连线相关的数叫做权,Weight)。

如图:A表示不及格,B表示及格,C表示良好,D表示优秀
5%同学不及格,15%同学及格,70%同学良好,10%同学优秀

136aae9a707ae3aba52a6d86feeeb6ee.png

带权二叉树.png

  • 结点的路径长度:从根结点到该结点的路径上的连接数。
  • 树的路径长度:树中每个叶子结点的路径长度之和。
  • 结点带权路径长度:结点的路径长度与结点权值的乘积。
  • 树的带权路径长度:WPL(Weighted Path Length)是树中所有叶子结点的带权路径长度之和。

WPL的值越小,说明构造出来的二叉树性能越优。

构造出最优的赫夫曼树,如图:

402b762a613bf69f3e773faf82fc0863.png

构造赫夫曼树过程.png

二、赫夫曼编码

当年赫夫曼的草图:

11982e62089f3cf6183bd9d34bdf1943.png

赫夫曼编码.png

赫夫曼编码可以很有效地压缩数据(通常可以节省20%~90%的空间,具体压缩率依赖于数据的特性)。

名词解释:定长编码,变长编码,前缀码

  • 定长编码:像ASCII编码
  • 变长编码:单个编码的长度不一致,可以根据整体出现频率来调节
  • 前缀码:所谓的前缀码,就是没有任何码字是其他码字的前缀

步骤:

  1. build a priority queue
  2. build a huffmanTree
  3. build a huffmanTable
  4. encode
  5. decode


作者:JS_HCX
链接:https://www.jianshu.com/p/32307411cff0
来源:简书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值