解决哈夫曼编码树问题
哈夫曼编码树解码概念
(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止
emmmm很绕对吧,那咱们来电通俗易懂点的例子。(期末考试题是第二个例子)
比如说 a,b,d,c,d,f 出现的频率是 12345次
并写出a~f的前辍编码,规定左孩子编码为0,右孩子编码为1
据题意得:
那么我们来做一个集合
{1,2,3,4,5}
①先取最小的俩数。最小的俩数不就是1,2了嘛。
②把这俩合并起来。他们俩的根节点是他们俩相加的值
来我们先画出来。
3
/ \
1 2
对就像这样,然后这时候就新生成了新的集合{3,3,4,5}(注意1,2就已经合给3了)
我们再重复刚才的两个步骤, 取最小的俩数,不就是3,3了 来画出来
6
/ \
3 3
/ \
1 2
集合更新(6,4,5) 这时候我们发现出现了新的最小数 4,5
6 9
/ \ / \
3 3 4 5
/ \
1 2
现在集合就剩下 6 和9了 (解完了)
15
/ \
6 9
/ \ / \
3 3 4 5
/ \
1 2
左子树为0 右子树为1.ABCDE一定是叶子结点,所对应的哈弗曼编码就是从根节点“读”下来。 所以各字符对应的编码为:A->11,B->10,C->00,D->011,E->010
哈夫曼编码是一种无前缀编码。解码时不会混淆。其主要应用在数据压缩,加密解密等场合。
例题写完了,咱们做一下期末考试的大题吧:
已知字符a~f的出现频率分别是55、30、19、3、6、16,在此基础上构造Huffman树,并写出a~f的前辍编码,规定左孩子编码为0,右孩子编码为1。(6分)
现在的集合是{55,30,19,16,6,3}
先取最小的权值 即
9
/ \
6 3
现在变成了 {55,30,19,16,9}继续取最小权值
25
/ \
16 9
/ \
6 3
现在变成了 {55,30,19,25}
44
/ \
19 25
/ \
16 9
/ \
6 3
现在变成了 {55,30,44}
74
/ \
30 44
/ \
19 25
/ \
16 9
/ \
6 3
{55,74}
129
/ \
55(a) 77
/ \
30(b) 44
/ \
19(c) 25
/ \
16(f) 9
/ \
6(e) 3(d)
排序一下,55(a) 30(b) 19(c) 16(f) 6 (e) 3(d)
a:0
B:10
C:110
F:1110
e:11110
d:11111