1、哈夫曼树的定义

》》 在许多应用中,树中结点常常被赋予一个表示某种意义的数值,称为该结点的权。从树根结点到

任意结点的路径长度(经过的边数 ) 与该结点上权值的乘积称为该结点的带权路径长度

》》 树中所有叶结点的带权路径长度之和称为该树的带权路径长度,记为:

WPL = 

其中  是第 i 个叶结点所带的权值;  是该叶结点到根结点的路径长度

》》 在含有 N 个带权叶结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为“ 哈夫曼树 ”

也称为 “ 最优二叉树 ”

》》 案例: 下面的案例中有 3 棵二叉树,都有 4 个叶子结点 a 、 b 、 c 、 d ,分别带权 7 、 5 、 2 、 4 ,

它们的带权路径长度分别为:

(a) WPL = 7*2+5*2+2*2+4*2 = 36

(b)WPL =  7*3+5*3+2*1+4*2 = 46

(c) WPL = 7*1+5*2+2*3+4*3 = 35

通过计算 WPL , 可得知(c) 树中的 WPL 最小,验证,它恰为“ 哈夫曼树 ”

2、哈夫曼树的构造

》》 给定 N 个权值分别为 W1 , W2 ,W3 , ... , Wn  的结点。通过哈夫曼算法可以构造出最优二叉树,

             算法的描述如下:

1)、将这个 N 个结点分为作为 N 棵仅含有一个结点的二叉树,构成森林 F 。

2)、构造一个新结点,并从 F 中选取两棵根结点权值最小的树作为新结点的左、右子树,

并且将新结点的权值置为左、右子树上根结点的权值之和。

3)、从 F 中删除刚才选出的两棵树,同时将新得到的树加入 F 中 。

4)、重复步骤 2)、3) ,直至 F 中只剩下一棵树为止。

补充: 从上述构造过程中可以看出哈夫曼树具有如下特点

1)、每个初始结点最终都成为叶结点,并且权值越小的结点到根结点的路径长度越大。

2)、构造过程中总共新建了 N -1 个结点(双分支结点),因此哈夫曼树中结点总数为

2N -1 。

3)、每次构造都选择了2 棵树作为新结点的孩子,因此哈夫曼树中不存在度为 1 的结点。

3、哈夫曼编码

》》 对于待处理的一个字符串序列,如果对每个字符用同样长度的二进制位来表示,则称这种编码

方式为“ 固定长度编码 ”。

若允许对不同字符用不等长的二进制位表示,则这种方式称为“ 可变长度编码 ”。

》》 可变长度编码比固定长度编码好得多,其特点是对频率高的字符赋以短编码,而对频率较低的

字符赋以较长一些的编码,从而可以使字符串平均编码长度减短,起到压缩数据的效果。

哈夫曼编码是一种被广泛应用而且非常有效的数据压缩编码

》》 如果没有一个编码是另一个编码的前缀,则称这样的编码为“ 前缀编码 ” 。 如 0 、 101 、100 是

前缀编码。对前缀编码的解码也是很简单的,因为没有一个码是其他码的前缀。所以,可以识别出

第一个编码,将它翻译为原码,再对余下的编码文件重复同样的操作。如 00101100 可被唯一地分

析为 0 、 0 、 101 、 100。

树和二叉树的应用 -- ---哈夫曼(Huffman)树和哈夫曼编码相关推荐

  1. 哈夫曼 (Huffman) 树的动画演示

     哈夫曼 (Huffman) 树的动画演示: http://people.cs.pitt.edu/~kirk/cs1501/animations/Huffman.html 此网站中亦有诸多其它算法 ...

  2. java 实现部门树_(java实现)哈夫曼(Huffman)树编码(自编压缩项目基础)

    哈夫曼树 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树, 若该树的带权路径长度(wpl) 达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 也叫霍夫曼树. 哈 ...

  3. 数据结构入门----赫夫曼Huffman树及其应用

    最优二叉树(霍.赫.哈夫曼树) 路    径: 由一结点到另一结点间的分支所构成. 路径长度: 路径上的分支数目.a→e的路径长度=2 树的路径长度: 从树根到每一结点的路径长度之和.树长度=10 带 ...

  4. 赫夫曼(Huffman)树/编码

    一 . 基本概念: 赫夫曼树:给定带权的N个叶子构成的所有二叉树中,树的带权路径长度最小的二叉树(最优二叉树) 带权路径长度:所有树叶到树根之间的路径长度与该节点上权的乘积 权:赋予节点的有意义的参数 ...

  5. 基础练习 Huffuman树 _C语言和C++描述!(Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。   给出一列数{pi}={p0, p1, …, pn-1)

    问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 1. ...

  6. 数据结构——哈夫曼(Huffman)树+哈夫曼编码

    哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头 ...

  7. 哈夫曼编码(基于哈夫曼树-最优二叉树,不唯一)、B树(b-树)、B+树

    整合自: http://blog.csdn.net/shuangde800/article/details/7341289 http://www.cnblogs.com/Jezze/archive/2 ...

  8. 数据结构-王道-树和二叉树

    [top] 树和二叉树 树:是\(N(N\geq0)\)个结点的有限集合,\(N=0\)时,称为空树,这是一种特殊情况.在任意一棵非空树中应满足: 有且仅有一个特定的称为根的结点. 当\(N>1 ...

  9. 数据结构与算法——树和二叉树***

    第五章 :树和二叉树 树和图是两种重要的非线性结构.线性结构中结点具有唯一前驱和唯一后继的关系,而非线性结构中结点之间的关系不再具有这种唯一性.其中,树形结构中结点间的关系是前驱唯一而后继不唯一,即元 ...

  10. 408数据结构考研笔记——第五章树与二叉树(重点)

    目录 一.基本概念 1.定义 2.基本术语 3.性质(重点!!) 二.二叉树 1.定义 2.特殊二叉树 1.满二叉树 2.完全二叉树 3.二叉排序树 4.平衡二叉树 3.性质 4.存储结构 1.顺序存 ...

最新文章

  1. CUDA 7 Stream流简化并发性
  2. VS中stack around the variable ‘****‘ was corrupted堆栈被破坏
  3. python中一个汉字是几个字符_Python中每次处理一个字符的5种方法
  4. 通过Cookie实现客户端与服务端会话的维持;
  5. eslint git提交不上_Git常用命令及日常问题集锦
  6. 部落卫队pascal解题程序
  7. 北京某公司.NET面试题
  8. 计算机网络实验(华为eNSP模拟器)——第五章 单臂路由
  9. anki模板_梁宝川:如何导入,导出anki笔记?
  10. 浏览器了解(三)CSS解析
  11. 表格如何excel在线转letex
  12. 《编程机制探析》第二章 计算机语言
  13. 【矩阵论】矩阵的广义逆
  14. 范德堡大学计算机科学专业,美国范德堡大学的专业排名
  15. 阿里矢量图标iconfont在微信小程序的使用
  16. 加密和解密的应用_万金油_新浪博客
  17. Mybatis 任务二:配置文件深入
  18. 读取excel批量生成二维码
  19. 全渠道会员通-天猫会员通1: 开通教程
  20. Android Studio 自定义View命名空间报错的解决方法

热门文章

  1. 在linaro中安装opencv
  2. Win7/Vista激活后添加grub引导Linux最简单方法!无需命令行!
  3. Arduino和LabVIEW射频校园火警系统
  4. 2019智能网联汽车技术大会 | 感知+计算——解决智能网联汽车感知困境的必然趋势...
  5. OPEN-WRT老毛子固件的无线中继设置建议
  6. Arduino学习(九): 写一个Arduino扩展库:音乐播放库,并实现跨平台
  7. python爬虫qq音乐歌词_10、 在QQ音乐中爬取某首歌曲的歌词
  8. H3C网络故障排除方法
  9. 淘宝/天猫上传图片到淘宝 API
  10. JavaScript打开关闭窗口事件