树和二叉树的应用 -- ---哈夫曼(Huffman)树和哈夫曼编码
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)树和哈夫曼编码相关推荐
- 哈夫曼 (Huffman) 树的动画演示
哈夫曼 (Huffman) 树的动画演示: http://people.cs.pitt.edu/~kirk/cs1501/animations/Huffman.html 此网站中亦有诸多其它算法 ...
- java 实现部门树_(java实现)哈夫曼(Huffman)树编码(自编压缩项目基础)
哈夫曼树 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树, 若该树的带权路径长度(wpl) 达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 也叫霍夫曼树. 哈 ...
- 数据结构入门----赫夫曼Huffman树及其应用
最优二叉树(霍.赫.哈夫曼树) 路 径: 由一结点到另一结点间的分支所构成. 路径长度: 路径上的分支数目.a→e的路径长度=2 树的路径长度: 从树根到每一结点的路径长度之和.树长度=10 带 ...
- 赫夫曼(Huffman)树/编码
一 . 基本概念: 赫夫曼树:给定带权的N个叶子构成的所有二叉树中,树的带权路径长度最小的二叉树(最优二叉树) 带权路径长度:所有树叶到树根之间的路径长度与该节点上权的乘积 权:赋予节点的有意义的参数 ...
- 基础练习 Huffuman树 _C语言和C++描述!(Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。 给出一列数{pi}={p0, p1, …, pn-1)
问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 1. ...
- 数据结构——哈夫曼(Huffman)树+哈夫曼编码
哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头 ...
- 哈夫曼编码(基于哈夫曼树-最优二叉树,不唯一)、B树(b-树)、B+树
整合自: http://blog.csdn.net/shuangde800/article/details/7341289 http://www.cnblogs.com/Jezze/archive/2 ...
- 数据结构-王道-树和二叉树
[top] 树和二叉树 树:是\(N(N\geq0)\)个结点的有限集合,\(N=0\)时,称为空树,这是一种特殊情况.在任意一棵非空树中应满足: 有且仅有一个特定的称为根的结点. 当\(N>1 ...
- 数据结构与算法——树和二叉树***
第五章 :树和二叉树 树和图是两种重要的非线性结构.线性结构中结点具有唯一前驱和唯一后继的关系,而非线性结构中结点之间的关系不再具有这种唯一性.其中,树形结构中结点间的关系是前驱唯一而后继不唯一,即元 ...
- 408数据结构考研笔记——第五章树与二叉树(重点)
目录 一.基本概念 1.定义 2.基本术语 3.性质(重点!!) 二.二叉树 1.定义 2.特殊二叉树 1.满二叉树 2.完全二叉树 3.二叉排序树 4.平衡二叉树 3.性质 4.存储结构 1.顺序存 ...
最新文章
- CUDA 7 Stream流简化并发性
- VS中stack around the variable ‘****‘ was corrupted堆栈被破坏
- python中一个汉字是几个字符_Python中每次处理一个字符的5种方法
- 通过Cookie实现客户端与服务端会话的维持;
- eslint git提交不上_Git常用命令及日常问题集锦
- 部落卫队pascal解题程序
- 北京某公司.NET面试题
- 计算机网络实验(华为eNSP模拟器)——第五章 单臂路由
- anki模板_梁宝川:如何导入,导出anki笔记?
- 浏览器了解(三)CSS解析
- 表格如何excel在线转letex
- 《编程机制探析》第二章	计算机语言
- 【矩阵论】矩阵的广义逆
- 范德堡大学计算机科学专业,美国范德堡大学的专业排名
- 阿里矢量图标iconfont在微信小程序的使用
- 加密和解密的应用_万金油_新浪博客
- Mybatis 任务二:配置文件深入
- 读取excel批量生成二维码
- 全渠道会员通-天猫会员通1: 开通教程
- Android Studio 自定义View命名空间报错的解决方法
热门文章
- 在linaro中安装opencv
- Win7/Vista激活后添加grub引导Linux最简单方法!无需命令行!
- Arduino和LabVIEW射频校园火警系统
- 2019智能网联汽车技术大会 | 感知+计算——解决智能网联汽车感知困境的必然趋势...
- OPEN-WRT老毛子固件的无线中继设置建议
- Arduino学习(九): 写一个Arduino扩展库:音乐播放库,并实现跨平台
- python爬虫qq音乐歌词_10、 在QQ音乐中爬取某首歌曲的歌词
- H3C网络故障排除方法
- 淘宝/天猫上传图片到淘宝 API
- JavaScript打开关闭窗口事件