哈夫曼树和哈夫曼编码

哈夫曼树

哈夫曼树是一种带权路径长度最短的二叉树,也称最优二叉树:

图a
图b
它们的带权路径长度为:
图a:WPL = 5 * 2 + 7 * 2 + 2 * 2 + 13 * 2 = 54 图b:WPL = 5 * 3 + 2 * 3 + 7 * 2 + 13 * 1 = 48
可见,图b的带权路径长度较小,图b就是哈夫曼树(最优二叉树)

构建哈夫曼树

  1. 将所有左、右子树都为空的节点作为根节点。
  2. 在森林中选出两棵根节点的权值最小的树作为一棵新树的左、右子树,并更新新树的附加节点的权值为左、右子树上根节点的权值之和。(左子树权值应小于右子树权值)
  3. 从森林中删除这两棵树,同时把新树加入到森林中。
  4. 重复2、3步,直到森林中只有一棵树为止,此树便是哈夫曼树。
    图解建树过程
    bulidtree1
    buildtree2
    bulidtree3
    bulidtree4

哈夫曼编码

利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码. 树中,从根到每个叶子节点都有一条路径,对路径上各分支约定指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为各个叶子节点对应的字符编码,称为哈夫曼编码. 用上图的例子来说:
HuffmanCode A,B,C,D对应的哈夫曼编码分别为:111,10,110,0

哈夫曼编码&压缩

哈夫曼在通信领域有很多的用途,将需要传输的数据转换01串,相比直接传输极大提高了传输的速率,同时还是数据压缩的重要方法。

哈夫曼压缩思路

假设一字符串为:“abcabcabcabcabcabcddddddddd”,统计各字符出现次数:
字符 出现次数
a 6
b 6
c 6
d 9
按照一般存储方法,一个字符占用一个字节,共占用空间 (6 + 6 + 6 + 9) * sizeof(char) = 27字节,27字节确实不算什么,但是如果是海量数据的话,就必须考虑存储空间的问题了。 我们试着建立哈夫曼树:
把出现次数当做权重,出现次数越多的话就越靠近根节点,编码也就越短:
picture

上面的字符串就转换成了“0001,1000,0110,0001,1000,0110,0001,1000,0110,1111,1111,1111,1111,11”,按位储存。之前的27字节的字符串就转化成了7字节(不足补零),这就达到了压缩的效果。

小结:利用哈夫曼树的特点,权重越大越靠近根节点,编码也就越短,将字符出现次数作为权重,文本中出现次数最多的字符就被压缩成了很短的编码.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值