哈夫曼编码的平均码长java_2018.2.14 Java中的哈夫曼编码

本文介绍了哈夫曼编码的概念,它是基于字符出现概率构造的最优化编码方式。内容包括哈夫曼编码的原理,哈夫曼树的构建过程,并通过实例详细解析了如何构造哈夫曼树,以最小化带权路径长度。
摘要由CSDN通过智能技术生成

###概念

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

###哈夫曼原理

6b6d15dce058dd248fb4e1ec2adac08a.png

###哈夫曼算法流程图

5f4793ea88e77378923fc8e2762cd164.png

###哈夫曼树

给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 树节点间的边相关的数叫做权。

a31aafde9092c66d15a21dccc071ad76.png

从树中的一个节点到另一个节点之间的分支构成两个点之间的路径,路径上的分支数目称作路径长度。

图中二叉树a中,跟节点到D的路径长度就是4,b中根节点到D的路径长度为2。

树的路径长度就是从树根到每一个节点的路径长度之和。二叉树a的路径长度就为1+1+2+2+3+3+4+4=20。二叉树b的树路径长度就为1+2+3+3+2+1+2+2=16。

如果考虑带权的节点,节点的带权的路径长度就是从该节点到树根之间的路径长度乘该节点的权。

数的带权路径长度就是所有叶子节点的带权路径长度之和。

带权路径长度(WPL)最小的二叉树称作哈夫曼树。

###如何构造哈夫曼树

下面我们以【5、8、4、11、9、13】为例来画出哈夫曼树(数字大小代表权重大小,越大的权重越大)

第一步:按从小到大排序。

【5、8、4、11、9、13】→【4、5、8、9、11、13】

第二步:选最小两个数画出一个树,最小数为4和5。

给定的4、5、8、9、11、13为白色, 红色的9为4+5,与给定的白9无关,新序列为:【红9(含子节点4、5)、8、9、11、13】

7c32921730e11bf4bbcd3d27c9b22767.png

####之后一直重复第一、第二步:排序然后取两个最小值。实际就是一个递归过程

排序:

427752598b7e8bb28559faf6dcbad286.png

取两个最小数8和9:

88301ca443a1051d66f1f46521af7b89.png

排序

1737bb7a7aa7bf7d77408aa4426a7797.png

区两个最小数11和9

bb816ae09eb87a575a611687ad4ef4f2.png

排序,然后取两个最小数13和17:

9fe015ce56c7a4c6734d7d0931184813.png

取两个最小数20和30:

9fb61279d0b9f2ea5b5734649302d171.png

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值