CSP初赛复习-05哈夫曼树和哈夫曼编码
CSP初赛复习-05哈夫曼树和哈夫曼编码
哈夫曼树的基本概念
树的路径长度PL:
-
从树根到树的每个节点的路径长度(每条边长度为1)之和
-
完全二叉树为这种路径长度(PL)最短的二叉树
树的带权路径长度WPL:
树的所有叶子节点的带权路径长度(该节点到根节点路径长度与节点上权的乘积)之和。
WPL=7 * 3 + 5 * 3 +2 * 1 +4 * 2 =46
WPL计算公式
哈夫曼树:
-
带权路径长度WPL最短的二叉树(最优二叉树)
-
构造这种树的算法最早是由哈夫曼(Huffman)1952年提出,这种树在信息检索中很有用。
例1,构造哈夫曼树的WPL为35是最小的。具体比较如下图:
如何构造一棵哈夫曼树?(哈夫曼树也是一棵二叉树)
给n个点,每个点都有权值,构造一棵哈夫曼树。每次选剩下的两棵根权值最小的树合并成一棵新树,新树的根权值等于两棵合并前树的根权值和。(一开始一个点也看成一棵树,只不过这棵树没有孩子节点)
例1:4个点,a、b、c、d,权值分别为7、5、2、4。
构树过程:因为4个点,所以合并3次(n个点,合并n-1次)
第一步:选根权值最小的两棵树2(c)和4(d)合并,新树的根节点为6,如图(b);
第二步:选根权值最小的两棵树5(b)和6合并,新树的根节点为11,如图(c);
第三步:选根权值最小的两棵树7(a)和11合并,新树的根节点为18,如图(d);
例2:6个点,a、b、c、d、e、f,权值分别为0.4、0.3、0.1、0.1、0.02、0.08。
构图过程同例1(如下图)
哈夫曼编码
一篇电文,原文为:AMCADEDDMCCAD。现在要把原文转换成01串发送给对方。为了节省资源,我们当然希望翻译好的01串长度尽量的短。怎么办?
研究发现:
1、只有5个字母E,M,C,A,D;
2、这5个字母的使用频度分别为{E,M,C,A,D}={1,2,3,3,4}。
用频度为权值生成哈夫曼树,并在叶子上标注对应的字母,在树枝上标注分配码“0”或“1”(注:分配码不是边的长度,而是区分左右孩子代表方向):
哈夫曼编码原则:
n个节点(n个叶子节点)的哈夫曼树含有2n-1个节点,没有度为1的节点 编码从叶子节点到根节点,译码从根节点到叶子节点。
从哈夫曼树根节点开始,对左子树分配码“0”,右子树分配码“1”,一直到达叶子节点为止,然后将从树根沿每条路径到达叶子结点的代码排列起来,便得到了哈夫曼编码。
各字母的编码即为哈夫曼编码: EMCAD 所有编码长度和为12位,即PL=12,此时的PL并不是最小的,但此时的WPL一定是最小的。WPL最小才能使得密报翻译的01串长度最短。
例3:对原电文进行哈夫曼编码,如下图,则哈夫曼编码的WPL= 1 * 3 + 2 * 3 + 3 * 2 + 3 * 2 + 4 * 2 = 29 。
解析:
E:000 3位二进制 所以1 * 3
M:001 3位二进制 出现次数为2 所以 2 * 3
C:01 2位二进制,出现次数为3 所以 3 * 2
A:10 2位二进制,出现次数位3 所以 3 * 2
D:11 2位二进制,出现次数位4,所以 4 * 2
所以
WPL= 1 * 3 + 2 * 3 + 3 * 2 + 3 * 2 + 4 * 2 = 29
例4: 对原电文进行等长编码,则:
等长编码的WPL = 1 * 3 + 2 * 3 + 3 * 3 + 3 * 3 + 4 * 3 = 39
所以哈夫曼编码可以节省空间。
原电文AMCADEDDMCCAD翻译成01串后为:10001011011000111100101011011。
对方根据事先构造好的哈夫曼树编码表可以还原原电文。
哈夫曼编码的性质
1)哈夫曼编码是前缀编码,任何一个字符的编码都不是另一个字符编码的前缀
只对叶子节点进行编码/解码唯一
例如字符串:CCACE
编码:
01011001000
解码:
根据当前的编码,找到对应的字符,此字符是唯一的(从根节点找到叶子节点)
2)哈夫曼编码是一种最优前缀编码
权值(出现次数)大的编码短,这种贪心策略可以保证总体编码最短
3)哈夫曼编码是一种贪心算法
从树的集合中选取两个频率最低的字符,使其作为左右子树构造一棵新树,父节点的频率为左右节点频率之和,然后将新树插入到树的集合中
贪心策略:出现频率低的在树中的深度高,编码长
CSP初赛复习-05哈夫曼树和哈夫曼编码-练习
https://www.cnblogs.com/myeln/articles/17538919.html
作者:newcode 更多资源请关注纽扣编程微信公众号

从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习

浙公网安备 33010602011771号