参考《大话数据结构》

       以学生成绩为例进行分析,正常的学生成绩的分布范围如下:

下面的图是普通的学生成绩判断,粗略的看什么问题,可是通常都认为,一张好的考卷应该是让学生的成绩大部分处于中等或良好的范围,优秀和不及格都应该比较少才对。而这个判断方式,就使得所有的成绩都需要先判断是否及格,再逐级比较而上得到结果。输入量很大时,其实算法是有效率问题的。

有没有好一些的办法呢?仔细观察发现,中等成绩(70-79之间)比例最高,其次是良好成绩,不及格的所占比例最少。我们把上图这棵二叉树重新进行分配,改成如下的判断。

从图中感觉效率要高一些,到底高多少呢?这样的二叉树又是如何设计出来的呢?这就是下面要说的赫夫曼定义及原理。

我们先把这两棵二叉树简化成叶子结点带权的二叉树(树结点间的边相关的数叫做权Weight),分别如下图所示,其中A表示不及格、B表示及格、C表示中等、Db表示良好、E表示优秀。每个叶子的分支线上的数字就是刚才我们提高的五级分制的成绩所占百分百。

赫夫曼说:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称为路径长树的路径长度就是从树根到每一结点的路径长度。二叉树a的路径长度为20,二叉树b的树路径长度就为16。

如果考虑到带权的结点,结点的带权的路径长度为从该结点到树根之间的路径长度与结点上权的乘积。带权路径长度WPL最小的二叉树称为赫夫曼树

二叉树a的WPL=5*1+15*2+40*3+30*4+10*4=315

二叉树b的WPL=5*3+15*3+40*2+30*2+10*2=220

说明了什么?如果现在有10000个学生的百分制成绩需要计算五分制成绩,用二叉树a的判断方法,需要做31500次的比较,而二叉树b的判断方法,只需要比较22000次的比较,差不多少了三分之一量,在性能上不止提升一点点。

那么问题来了,如何构造出b这样的树呢?这样的树是不是最优的赫夫曼树呢?

赫夫曼树构造步骤:

1、先把有权值的叶子结点按照从小到大的顺序排序成一个有序序列,即:A5、E10、B15、D30、C40。

2、取头两个权值最小的结点作为一个新节点N1的两个子节点,注意相对较小的是左孩子,这里就是A为N1的左孩子,E为N1的右孩子,新节点的权值为两个叶子节点权值的和5+10=15。

3、将N1替换A与E,插入有序序列中,保持从小到大排序。即:N115,B15,D30,C40。

4、重复步骤2。将N1与B作为一个新结点N2的两个子节点,如下图所示。N2的权值=15+15=30。

5、重复上述步骤,直到剩余结点数为1。即完成了赫夫曼树的构造。

此时的二叉树的带权路径长度WPL=40*1+30*2+15*3+10*4+5*4=205。比刚开始构造出来的b二叉树的少15,显然此时构造出来的二叉树才是最优的赫夫曼树。不过现实总是比理想要复杂得多,上图虽然是赫夫曼树,但由于每次判断都要比较两次(如根节点就是a<80&&a>=70,两次比较才能得到y或n的结果),所以总体性能上,反而不如二叉树b的性能高。

赫夫曼树的定义及原理相关推荐

  1. 数据结构Java06【赫夫曼树、概述、原理分析、代码实现(数据压缩、创建编码表、解码、压缩文件、解压文件)】

    学习地址:[数据结构与算法基础-java版]                  

  2. 【赫夫曼树详解】赫夫曼树简介及java代码实现-数据结构07

    赫夫曼树(最优二叉树) 1. 简介 定义: 赫夫曼树是n个带权叶子结点构成的所有二叉树中,带权路径长度(WPL)最小的二叉树. 叶子结点的带权路径: 叶子结点权值*到根节点的路径长度(叶结点的层数) ...

  3. 赫夫曼树和赫夫曼编码(C语言版)

    赫夫曼树和赫夫曼编码(C语言版) 一.赫夫曼树 (一)赫夫曼树的定义及表示方法 二.赫夫曼编码 (一)赫夫曼编码的定义及表示方法 三.C语言编写 (一)代码设计思路 1构造赫夫曼树 2在哈夫曼树上构建 ...

  4. 数据结构与算法之Huffman tree(赫夫曼树 / 霍夫曼树 / 哈夫曼树 / 最优二叉树)

    目录 赫夫曼树概述 定义 构造赫夫曼树步骤 代码实现 赫夫曼树概述 HuffmanTree因为翻译不同所以有其他的名字:赫夫曼树.霍夫曼树.哈夫曼树 赫夫曼树又称最优二叉树,是一种带权路径长度最短的二 ...

  5. 赫夫曼树的原理和构建

    赫夫曼树的原理和构建 1. 赫夫曼树的构造 给定N个权值分别为w1, w2, -, Wn的节点.构造赫夫曼树的算法描述如下: ​ 1)将这N个结点分别作为N棵树仅含一个结点的二叉树,构成森林F. ​ ...

  6. 赫夫曼树的创建,赫夫曼编码的原理及使用

    目录 一.创建赫夫曼树 代码实现:最后返回值式创建好的赫夫曼树的顶点 对int[] arr = {13, 7, 8, 3, 29, 6, 1};进行赫夫曼树,我们创建好的node数组依次是这样变化 创 ...

  7. 算法系列之赫夫曼树的精解【构造流程及原理分析】

    赫夫曼树又称为最优树.最优二叉树 赫夫曼树百度百科 https://baike.baidu.com/item/%E5%93%88%E5%A4%AB%E6%9B%BC%E6%A0%91/2305769? ...

  8. 数据结构与算法——赫夫曼树基本实现

    目录 一.赫夫曼树 1.1 基本介绍 1.2 赫夫曼树创建步骤图解 1.3  代码实现 二.赫夫曼编码 2.1 基本介绍 2.1.1  通讯领域 - 定长编码 - 举例说明 2.1.2  通讯领域 - ...

  9. 赫夫曼树以及赫夫曼编码实现

    介绍 赫夫曼树创建图解思路 一直找就找到最好的样子: 赫夫曼树创建代码实现 package 树;import java.util.ArrayList; import java.util.Collect ...

最新文章

  1. 登高自卑 | 我的PyTorch入门与实践笔记
  2. java三大特性:封装、继承、多态
  3. linux 公钥登录
  4. SAP CRM webclient ui drop down list key mode
  5. [MySQL]经常无故崩溃amd.dll , boot1.exe病毒
  6. 基于 HTML5 WebGL 的 3D 服务器与客户端的通信
  7. ANDROID模拟器不能启动
  8. 当程序员具备了抽象思维
  9. python图形绘制星空图_天文星空图谱开源软件Stellarium
  10. 初次Blender建模遇到的问题与解决方法
  11. 深富策略:指数横盘震荡整理 汽车整车表现亮眼
  12. RGB三通道图像和灰度值简单理解
  13. 【案例】路由器怎么自动获取IPv6地址?
  14. CST816S触摸驱动
  15. eclipse快捷键的设置和使用
  16. 地理空间索引:线段与多边形的GeoHash编码
  17. 一个关于农历的算法----js实现【转】
  18. MacBook Pro m1 homebrew 安装,卸载脚本
  19. Excel 技巧百例:随机填充数据
  20. python怎么导入math库_Python math数学库的用法

热门文章

  1. freemarker ftl模板_Web开发人员必会的模板引擎技术之Freemarker
  2. nginx 多个root_dockerfile定制自己的nginx
  3. python浏览器怎么设置_怎么设置jupyter的默认浏览器
  4. android自定义屏幕,Android自定义屏保
  5. 机器视觉使用光源的几个选择标准
  6. C++类的赋值运算符“=”重载,以及深拷贝和浅拷贝
  7. (译)通过WebChannel/WebSockets与QML中的HTML交互
  8. 微信小程序连接本地接口(转)
  9. mysql主从复制简单实现
  10. 解析全球热点安全事件背后的玄机