当前位置:网站首页>二叉树之_哈夫曼树_哈弗曼编码
二叉树之_哈夫曼树_哈弗曼编码
2022-06-25 12:16:00 【王会举】
哈夫曼树又称最优二叉树
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
名词解释
路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。图 1 中,从根结点到结点 a 之间的通路就是一条路径。
路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度为 i - 1 。图 1 中从根结点到结点 c 的路径长度为 3。
结点的权:给每一个结点赋予一个新的数值,被称为这个结点的权。例如,图 1 中结点 a 的权为 7,结点 b 的权为 5。
结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。例如,图 1 中结点 b 的带权路径长度为 2 * 5 = 10 。
树的带权路径长度为树中所有叶子结点的带权路径长度之和。通常记作 “WPL” 。例如图 1 中所示的这颗树的带权路径长度为:
WPL = 7 * 1 + 5 * 2 + 2 * 3 + 4 * 3

哈夫曼树解析:

三棵二叉树的带权路径长度为:
(a)WPL=9x2+4x2+5x2+2x2=18+8+10+4=40
(b)WPL=9x1+5x2+4x3+2x3=9+10+12+6=37
(c)WPL=4x1+2x2+5x3+9x3=4+4+15+27=50
其中(b)所示的二叉树的WPL最小,此树是哈夫曼树。由上图可知:由n个带权叶子结点所构成的二叉树中,满二叉树或完全二叉树 不一定是最优二叉树。权值越大的结点离根结点越近的二叉树才是最优二叉树。
怎么构建哈夫曼树?
对于给定的有各自权值的 n 个结点,构建哈夫曼树有一个行之有效的办法:
- 在 n 个权值中选出两个最小的权值,对应的两个结点组成一个新的二叉树,且新二叉树的根结点的权值为左右孩子权值的和;
- 在原有的 n 个权值中删除那两个最小的权值,同时将新的权值加入到 n–2 个权值的行列中,以此类推;
- 重复 1 和 2 ,直到所以的结点构建成了一棵二叉树为止,这棵树就是哈夫曼树。

哈夫曼编码
简易的理解就是,假如我有A,B,C,D,E五个字符,出现的频率(即权值)分别为5,4,3,2,1,那么我们第一步先取两个最小权值作为左右子树构造一个新树,即取1,2构成新树,其结点为1+2=3,如图:

虚线为新生成的结点,第二步再把新生成的权值为3的结点放到剩下的集合中,所以集合变成{5,4,3,3},再根据第二步,取最小的两个权值构成新树,如图:
再依次建立哈夫曼树,如下图:

其中各个权值替换对应的字符即为下图:

所以各字符对应的编码为:A->11,B->10,C->00,D->011,E->010
霍夫曼编码是一种无前缀编码。解码时不会混淆。其主要应用在数据压缩,加密解密等场合。
如果考虑到进一步节省存储空间,就应该将出现概率大(占比多)的字符用尽量少的0-1进行编码,也就是更靠近根(节点少),这也就是最优二叉树-哈夫曼树。
为什么?-----> 权值大的在上层,权值小的在下层。满足出现频率高的码长短。
哈夫曼编码的带权路径权值:叶子节点的值 * 叶子节点的高度(根节点为0)
上图的带权路径长度为:(3+4+5)*2+(1+2)*3=33
哈夫曼编码相关转载自 :https://blog.csdn.net/qq_36653505/article/details/81701181
边栏推荐
- 阿里稳定性之故障应急处理流程
- Render values to corresponding text
- Array reorder based on a field
- Talk about 11 key techniques of high availability
- PHP replaces the key of a two-dimensional array with a specified element value
- (2) Pyqt5 tutorial -- > using qtdesigner to separate interface code
- 百度搜索稳定性问题分析的故事
- el-select clear 清空内容时触发事件
- GPS NMEA protocol, 0183 positioning data format dual mode positioning: gnxxx gps+bd full version
- [data visualization] 360 ° teaching you how to comprehensively learn visualization - Part 1
猜你喜欢

(7) Pyqt5 tutorial -- > > window properties and basic controls (continuous update)

使用Visio画立方体

Swagger document generated by node project API in vscode

Idea2017 how to set not to automatically open a project at startup

mysql FIND_ IN_ Set function

2021-10-21

Navicat premium view password scheme

3+1保障:高可用系统稳定性是如何炼成的?

Penetration tool environment -- use of cknife Chinese kitchen knife

Laravel excel export
随机推荐
利用cmd(命令提示符)安装mysql&&配置环境
Singleton mode in PHP to reduce memory consumption
Ubuntu uninstalling PHP
PHP multidimensional array sorting
The difference between this and super and their respective functions
Wechat forbids sharing
2021-09-22
Command line garbled
地理空间搜索 ->R树索引
JS array length is defined
Possible problems when idea encounters errors occurred while compiling module (solved)
重装cuda/cudnn/pytorch
PPT绘论文图之导出分辨率
Go novice exploration pause
Negative sample image used in yolov5 training
[data visualization] 360 ° teaching you how to comprehensively learn visualization - Part 1
Go defer little knowledge
画图常用配色
Maximum number [abstract rules for abstract sorting]
PHP takes the difference set of two arrays