树 赫夫曼树的定义及建立 、赫夫曼编码的定义
2018-02-13 12:22
429 查看
以下有叶子结点带权的二叉树:
路径:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径
路径长度:路径上的分支数目
树的路径长度:根结点到每一个结点的路径长度和
在上图树的路径长度就为:1+1+2+2+3+3+4+4=20
带权路径长度WPL:从该结点到根结点之间的路径长度与结点上权的乘积
上图树的WPL:5*1+15*2+40*3+30*4+10*4=315
带权路径长度最小的二叉树称为赫夫曼树,也叫最优二叉树
最优二叉树有什么意义呢:
该图的叶子结点权值和上上图中一样,不过该图经过变换过
WPL=5*3+15*3+40*2+30*2+10*2=220
WPL的值相比于一个棵树要小很多,这意味着用这棵树解决实际问题效率大大提高
但该图不是最优二叉树,要找最优,还需要进行构造:
2.取头两个最小权值的结点作为一个新结点N1的两个子结点,注意相对较小的是左孩子,如图。新结点的权值为两个叶子权值之和5+10=15
3.将N1替换A与E放入序列,保持从小到大顺序:N1 15,B15,D30,C40
4.重复步骤2,将N1与B作为一个新结点N2的两个子结点,然后重复......
5.到C结点时,将C与N3作为一个新结点T的两个子结点,T是根结点,此时完成构造
所以需要传输”001000011010000011101100100011“ ,这样的编码十分冗长,所以我们需要想办法改进。
假设六个字母的频率:A 27,B 8,C 15,D 15, E 30, F 5 加起来是100%,这就意味着我们可以用赫夫曼树来构造它们。
左图是构造赫夫曼树的过程中的权值显示。右图将权值左支改为0,右支改成1。
此时我们就可以对六个字母用从根到叶子所经过的路径的0或1来进行编码,
此时我们的编码变为:”1001010010101001000111100“比原来的编码短了很多,相当于对数据的一种压缩,且随着字符的增多和字符权重不同,这种压缩编码会更加有优势
观察上表,这种新的编码的任一字符的编码都不是另一个字符的编码的前缀,这种编码叫做前缀编码
总结:
赫夫曼树的左支为0,右支为1,从根节点到叶子结点所经过的路径分支组成的0和1序列为该结点对应字符的编码,这就是赫夫曼编码
下面有一个题来初步运用赫夫曼树知识:
假设某段通信电文仅由 6 个字母 ABCDEF 组成,字母在电文中出现的频率分别为2,3,7,15,4,6。根据这些频率作为权值构造哈夫曼编码,最终构造出的哈夫曼树带权路径长度与字母 B 的哈夫曼编码分别为______。(这里假定左节点的值小于右节点的值)
路径:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径
路径长度:路径上的分支数目
树的路径长度:根结点到每一个结点的路径长度和
在上图树的路径长度就为:1+1+2+2+3+3+4+4=20
带权路径长度WPL:从该结点到根结点之间的路径长度与结点上权的乘积
上图树的WPL:5*1+15*2+40*3+30*4+10*4=315
带权路径长度最小的二叉树称为赫夫曼树,也叫最优二叉树
最优二叉树有什么意义呢:
该图的叶子结点权值和上上图中一样,不过该图经过变换过
WPL=5*3+15*3+40*2+30*2+10*2=220
WPL的值相比于一个棵树要小很多,这意味着用这棵树解决实际问题效率大大提高
但该图不是最优二叉树,要找最优,还需要进行构造:
赫夫曼树的构造
1.先把有权值的叶子结点按照从小到大的顺序排列为一个有序序列,即:A5,E10,B15,D30,C402.取头两个最小权值的结点作为一个新结点N1的两个子结点,注意相对较小的是左孩子,如图。新结点的权值为两个叶子权值之和5+10=15
3.将N1替换A与E放入序列,保持从小到大顺序:N1 15,B15,D30,C40
4.重复步骤2,将N1与B作为一个新结点N2的两个子结点,然后重复......
5.到C结点时,将C与N3作为一个新结点T的两个子结点,T是根结点,此时完成构造
赫夫曼编码
现在有一段文字:”BADCADFEED“需要传输,只有六个字母:ABCDEF,我们会想到用相应的二进制数据表示:
所以需要传输”001000011010000011101100100011“ ,这样的编码十分冗长,所以我们需要想办法改进。
假设六个字母的频率:A 27,B 8,C 15,D 15, E 30, F 5 加起来是100%,这就意味着我们可以用赫夫曼树来构造它们。
左图是构造赫夫曼树的过程中的权值显示。右图将权值左支改为0,右支改成1。
此时我们就可以对六个字母用从根到叶子所经过的路径的0或1来进行编码,
此时我们的编码变为:”1001010010101001000111100“比原来的编码短了很多,相当于对数据的一种压缩,且随着字符的增多和字符权重不同,这种压缩编码会更加有优势
观察上表,这种新的编码的任一字符的编码都不是另一个字符的编码的前缀,这种编码叫做前缀编码
总结:
赫夫曼树的左支为0,右支为1,从根节点到叶子结点所经过的路径分支组成的0和1序列为该结点对应字符的编码,这就是赫夫曼编码
下面有一个题来初步运用赫夫曼树知识:
假设某段通信电文仅由 6 个字母 ABCDEF 组成,字母在电文中出现的频率分别为2,3,7,15,4,6。根据这些频率作为权值构造哈夫曼编码,最终构造出的哈夫曼树带权路径长度与字母 B 的哈夫曼编码分别为______。(这里假定左节点的值小于右节点的值)
相关文章推荐
- 建立赫夫曼树以及求赫夫曼编码
- 赫夫曼编码(基于赫夫曼树的实现)
- 定义职工类Employee对象数组,内放5个职工的数据(编号、姓名、性别、月薪),建立函数输出职工信息表。
- 如何定义和建立架构
- 7.8 赫夫曼树应用解析(跟结点到叶子求每个字符的赫夫曼编码)
- 如何定义和建立架构
- 赫夫曼树与赫夫曼编码
- 定义单链表存储结构,用头插法和尾插法建立单链表,并显示建立好以后的结果。
- logstash如何读取json格式日志,并建立json定义好的索引
- 赫夫曼树和赫夫曼编码
- 赫夫曼树、赫夫曼编码和JAVA实现
- 在SQL2008中如何建立数据库并定义文件流FILESTREAM?
- 二叉树的建立(非递归建立与定义建立)与基本操作(广度和深度遍历,求叶子树高)实现
- 跟我一起学extjs5(28--加入模块和菜单定义[1建立数据库和表])
- 数据库中定义表和建立完整性代码
- MTK编程起步——建立新APP和资源定义
- 数据结构(c)——赫夫曼树与赫夫曼编码
- 建立完善的日期定义表
- 如何定义和建立架构
- 数据结构——如何定义与建立