树 赫夫曼树的定义及建立 、赫夫曼编码的定义

以下有叶子结点带权的二叉树:


路径:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径

路径长度:路径上的分支数目

树的路径长度:根结点每一个结点的路径长度和

在上图树的路径长度就为: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,C40

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是根结点,此时完成构造



赫夫曼编码
现在有一段文字:”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 的哈夫曼编码分别为______。(这里假定左节点的值小于右节点的值)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值