知识点:
权值小的节点在权值大的节点左边
左指数根节点上的值,一定要小于右指数根节点上的值
哈夫曼编码和译码都是唯一的
用哈夫曼树进行译码前缀编码:
指的是,任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。
哈夫曼编码是一种前缀码。
译码过程是编码过程的逆过程:
从哈夫曼树的根开始,从左到右把二进制编码的每一位进行判别,
若遇到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:11010 c:100 d:01 e:1011 f:00