基本概念

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

基本概念

  1. 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。
  2. 路径长度:路径上的分支数目称作路径长度。
  3. 树的路径长度:从树根到每一结点的路径长度之和。
  4. 权:赋予某个实体的一个量,是对实体的某个或某些属性的数值化描述。 在数据结构中,实体有结点(元素)和边(关系)两大类,所以对应有结点权和边权。 结点权或边权具体代表什么意义,由具体情况决定。如果在一棵树中的结点上带有权值,则对应的就有带权树等概念。
  5. 结点的带权路径长度:从该结点到树根之间的路径长度与结点上权的乘积。
  6. 树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记作WPL=∑i=1nwi∗liWPL=\sum_{i=1}^{n}{w_i*l_i}WPL=∑i=1n​wi​∗li​
  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 放回去作为根节点


带权路径长度:WPL=2∗4+3∗4+5∗3+6∗3+7∗3+8∗2+9∗2=108WPL =2*4+3*4+5*3+ 6*3+ 7*3+8*2+9*2= 108WPL=2∗4+3∗4+5∗3+6∗3+7∗3+8∗2+9∗2=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

这样就可以从根节点来找其对应的编码

听说你还不懂哈夫曼树和哈夫曼编码相关推荐

  1. 一文看懂哈夫曼树与哈夫曼编码

    转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUF ...

  2. 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码

    第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...

  3. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

  4. 哈夫曼树和哈夫曼树编码

    在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码. 首先介绍什么 ...

  5. Python数据结构11:树的实现,树的应用,前中后序遍历,二叉查找树BST,平衡二叉树AVL树,哈夫曼树和哈夫曼编码

    1.概念 树一种基本的"非线性"数据结构. 相关术语: 节点Node:组成树的基本部分.每个节点具有名称,或"键值",节点还可以保存额外数据项,数据项根据不同的 ...

  6. 哈夫曼树、哈夫曼编码详解

    哈夫曼树介绍 hello,大家好,我是bigsai.本以为哈夫曼树.哈夫曼编码很难,结果很容易嘛! 哈夫曼树.哈夫曼编码很多人可能听过,但是可能并没有认真学习了解,今天这篇就比较详细的讲一下哈夫曼树. ...

  7. 哈夫曼树与哈夫曼编码:

    定义:带权路径长度WPL最小的二叉树(在编写哈夫曼编码时用到的特殊二叉树) 构造过程: 其实就是每次在权值集合中选两个最小结点的组成新树,然后新树的根节点是二者的权值之和,将刚刚两个从集合中删掉,将新 ...

  8. 霍夫曼树和霍夫曼编码以及霍夫曼编码的应用

    文章目录 霍夫曼树介绍 1.1霍夫曼树的定义 1.2霍夫曼树的几个概念 1.3构建霍夫曼树的过程 1.4代码实现霍夫曼树 霍夫曼编码介绍 什么是霍夫曼编码 通信领域的应用 字符串压缩 1.构造霍夫曼树 ...

  9. 哈夫曼树构造哈夫曼编码

    在传输文字时,经常要将文字转换成二进制字符串.所以我们希望编码最短,但是又想保证它的唯一性.哈夫曼树具有最小带权路径长度,用来实现编码就可以编码最短,所以用哈夫曼树来构造编码.而前缀编码就可以保证在解 ...

最新文章

  1. ALV标准的分类小计功能
  2. bat for循环_bat教程[279] reg import命令的用法
  3. python去重计数_用Python实现透视表的value_sum和countdistinct功能
  4. Linux服务器管理神器-IPython
  5. 思杰新年动作片 | 超融合+公有云桌面虚拟化大战 VMware+AWS
  6. NVIDIA官方指南:libav编译支持Nvidia Codec(结果失败)
  7. 【React 】基于Antd Design的Switch开关选择器控件封装
  8. IDEA代码格式化校验
  9. 永磁同步电机矢量控制(二)——控制原理与坐标变换推导
  10. R语言绘图基础篇-线图
  11. 显示更清晰,书写更专业:汉王手写电纸本N10发布
  12. 寒假怎么过?经典计算机教材助你弯道超车
  13. abstract 抽象学习
  14. 认证管理(锐捷交换篇)
  15. 边玩边学,13个 Python 小游戏真有趣啊(含源码)
  16. oracle卸载完服务,ORACLE卸载安装服务启动
  17. Verilog学习笔记HDLBits——Finite State Machines(1)
  18. yii2 如何用命名空间方式使用第三方类库
  19. 优麒麟的一些使用上的问题
  20. PAT乙级 1070 结绳

热门文章

  1. ue4 运行禁用鼠标_从零开始——三:关闭电脑无用服务提高运行速度
  2. ha linux 设置虚拟ip_如何在虚拟机中设置CentOS静态IP?
  3. java二分法排序算法_Java中使用二分法排序
  4. zabbix对网站web监控(配置模板)
  5. linux查看shell类型与版本号,在Linux命令行下查询当前所使用的shell版本与种类的方法...
  6. 自动组卷系统C语言,模块化思想在试题库组卷系统中的应用--以C语言程序设计课程为例 (1).pdf...
  7. c++ string截取字符串_String类的常见用法
  8. @Autowired @Primary @Qualifier
  9. E20180327-hm
  10. [luoguP1013] 进制位(搜索)