听说你还不懂哈夫曼树和哈夫曼编码

基本概念

哈夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途。

基本概念

  1. 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。
  2. 路径长度:路径上的分支数目称作路径长度。
  3. 树的路径长度:从树根到每一结点的路径长度之和。
  4. 权:赋予某个实体的一个量,是对实体的某个或某些属性的数值化描述。 在数据结构中,实体有结点(元素)和边(关系)两大类,所以对应有结点权和边权。 结点权或边权具体代表什么意义,由具体情况决定。如果在一棵树中的结点上带有权值,则对应的就有带权树等概念。
  5. 结点的带权路径长度:从该结点到树根之间的路径长度与结点上权的乘积。
  6. 树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记作 W P L = ∑ i = 1 n w i ∗ l i WPL=\sum_{i=1}^{n}{w_i*l_i} WPL=i=1nwili
  7. 哈夫曼树:假设有m个权值{W1, W2, …,Wn},可以构造一棵含n个叶子结点的二叉树,每个叶子结点的权为 W;, 则 其中带权路径长度 WPL最小的二叉树称做最优二叉树或哈夫曼树。

下图中7,5,2,4分别代表其权重,他们的路径长度都为2,然后求和得到WPL

在这里插入图片描述
这个类似 权 值 X 路 径 权值X路径 X

通过上下对比可以看出下面的带权路径长度要小,所以下面这个恰为哈夫曼树
在这里插入图片描述
在哈夫曼树中,权值越大的结点离根结点越近。根据这个特点,哈夫曼最早给出了一个构造哈夫曼树的方法,称哈夫曼算法 。

算法构造

  1. 根据给定的n个权值{W1,W2…Wn},构造n棵只有根结点的二叉树,这n棵二叉树构成一个森林F。
  2. 在森林 F 中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左 、右子树上根结点的权值之和。
  3. 在森林F中删除这两棵树,同时将新得到的二叉树加入F中
  4. 重复2和3,直到F只含一棵树为止,这棵树便是哈夫曼树

这就是哈夫曼树,又叫最优二叉树,特点就是最大的在上面,小的在下面。

设给定权集 w={5,7,2,3,6,8,9}
先找出最小的 2 3 ,w删去2 3加上5,w现在是{5 5 7 6 8 9}
在这里插入图片描述

再找最小的5 5 提出来 加上10 w现在是{10 7 6 8 9}
在这里插入图片描述
再找 6 7 加上13 w现在是{10 13 8 9}
在这里插入图片描述
再找8 9 得到17 w现在是{10 13 17}
在这里插入图片描述
继续 拿出10 13 得到23 现在w{17 23}在这里插入图片描述
继续拿出17 23 得到40 放回去作为根节点

在这里插入图片描述
带权路径长度: W P L = 2 ∗ 4 + 3 ∗ 4 + 5 ∗ 3 + 6 ∗ 3 + 7 ∗ 3 + 8 ∗ 2 + 9 ∗ 2 = 108 WPL =2*4+3*4+5*3+ 6*3+ 7*3+8*2+9*2= 108 WPL=24+34+53+63+73+82+92=108

  1. 每个初始结点最终都成为叶结点,并且权值越小的结点到根结点的路径长度越大。
  2. 构造过程中共新建了N-1个结点(双分支结点) ,因此哈夫曼树中结点总数为2N:1。
  3. 每次构造都选择2棵树作为新结点的子节点,因此哈夫曼树中不存在度为1的结点
    哈夫曼编码最早用于解决远距离电报通信的数据传输最优化问题。
    比如ABCDE这一段文字。 通过网络传输要用到二进制的数字0和1。来保存A,B,C,D,E五个字母就可以了。
    在这里插入图片描述
    如果传输的信息很长,那么编码也很长在这里插入图片描述
    而且不用的字符和字母出现的频率也不一样,如A,E,I,O,U或者汉语中的你,我,他,的,了出现的频率都是很高的。
    我们可以将那些出现较多的字符编码少一点,而频率较小的字符编码长度可以长一点

如,abcde的频率如下图,可以将其频率转化成数值,来构造哈夫曼树
在这里插入图片描述
构造出来后我们可以将其左分支设置成0,右分支设为1
在这里插入图片描述
这样就可以从根节点来找其对应的编码
在这里插入图片描述

  • 29
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猛男技术控

感谢支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值