哈夫曼树及哈夫曼编码的构造方法

知识点:

权值小的节点在权值大的节点左边

左指数根节点上的值,一定要小于右指数根节点上的值

哈夫曼编码和译码都是唯一的

用哈夫曼树进行译码前缀编码:
指的是,任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。
哈夫曼编码是一种前缀码。

译码过程是编码过程的逆过程:

从哈夫曼树的根开始,从左到右把二进制编码的每一位进行判别,

若遇到0,则选择左分支走向下一个结点;

若遇到1,则选择右分支走向下一个结点,直至到达一个树叶结点,便求得相应字符。
 

题一:

已知在一个信息通信联络中使用了8个字符:a、b、c、d、e、f、g和h,每个字符的使用频度分别为:6、30、8、9、15、24、4和12, 试设计各个字符的哈夫曼编码

解题思路:

(1)试设计各个字符的哈夫曼编码:

我们先看题目中给出的数字,一般把数字小的放在最下面,以及左边

先是4和6组成10

然后再去找次小、最小的数字,然后是8和9,再组成一个二叉树,根得17

在剩下的数字中再找最小、次小的,是12,12和根最小数10组成22

再找最小和次小数字,是15,要要放在12和17中间,因为数字小的在左边,15和17组成32

然后再找最小和次小数字,是24,24与22组成46

 现在只剩30未分配了,于是30和32组成62

 这下就一目了然了,于是46和62组成108,这颗哈夫曼树就出来了

(2)请为aabcffh编码 

先把数字下对应的字母写到下面

 然后哈夫曼编码怎么编?先把0 1写上,记住,左枝是0,右枝是1

接下来编码 ,由上图可知哈夫曼编码为:

a:0001       b:10       c:1110       d:1111        e:110         f:01          g:0000           h:001

所以aabcffh编码为:0001 0001 10 1110 01 01 001

(3)请翻译以下的编码:

00011111110010010000    ----------------->    adefhg
000100011011100101001    ------------------>    aabcffh

译码在这里面找到的字符串一定是唯一的,比如说在战争年代发的密报

比如人家说的是明天反攻,而你翻译出来的是既可以明天反攻也可以明天撤退,那不出大问题了吗

题二: 

假设通信电文使用的字符集为{a,b,c,d,e,f},各字符在电文中出现的频度分别为:

0.34,0.05,0.12,0.23,0.08,0.18,试为这6个字符设计哈夫曼编码。

(1)请画出所构造的哈夫曼树(要求树中左孩子节点的权值小于右孩子节点的权值)

答:解题思路和上一题一样,我们首先第一步先在数字中找最小和次小的

先是0.05和0.08组成0.13

再去找最小和次小数,是0.12和0.13,组成0.25

然后在剩下的数字中找最小和次小的,是0.18和0.23,

接下来就剩下0.34、0.41、0.25未分配了,于是0.34和0.25组成0.59

 然后就剩下0.41和0.59了,又因为0.41比0.59小,所以在0.59左边

(2)分别写出每个字符对应的编码(要求左分支表示字符“0”,右分支表示字符“1”)

 

a:11           b:1010          c:100          d:01          e:1011          f:00 

  • 19
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二哈喇子!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值