(1)根据给定的n个权值{w1, w2, …,wn}, 构成n棵二叉树的集合F= {T1, T2, …Tn},其中,每棵树Ti中只有一个带权为wi的根结点,其左、右子树均空。
(2)在F中选取两棵权值最小的树作为左、右子树构造一棵新的二叉树,新构造二叉树的根结点的权值为其左、右子树根结点的权值之和。
(3)从F中删除这两棵树,同时将新得到的二叉树加入到F中。
(4)重复(2)、(3)步,直到F中只含一棵树时为止,这棵树便是霍夫曼树(哈夫曼树)。
【2019年第45-46题】己知某文档仅包含6种不同的字符,其每个字符出现的频率如下表所示,采用霍夫曼编码对该文档压缩存储,则单词“face”的编码为(1),该文档的压缩比为(2)。
(1)
A、110001001101
B、101000010100
C、001101001100
D、110101001100
(2)
A、20%
B、25%
C、30%
D、40%
解析:本题考查程序设计语言中二叉树数据结构的基础知识。
按照上面知识点所讲的构造方法:
(1)先找到权值最小的节点f、e,构造成一个权值为14的新节点,放到原来的表中,删除f、e这两个用过的节点。
(2)然后继续寻找剩下节点中权值最小的两个,发现是c和b,继续构造成权值为25的新节点,放到原来的表中,删除c、b这两个用过的节点。
(3)然后继续寻找剩下节点中权值最小的两个,发现是14和d,继续构造成权值为30的新节点,放到原来的表中,删除14、d这两个用过的节点。
(4)然后继续寻找剩下节点中权值最小的两个,发现是25和30,继续构造成权值为55的新节点,放到原来的表中,删除25、30这两个用过的节点。
(5)然后继续寻找剩下节点中权值最小的两个,发现就剩下了a和55,继续构造成权值为100的新节点至此构造完毕。构造霍夫曼树如下图所示:
由图可得各个字符的编码如下:
a:0;
b:101;
c:100;
d:111;
e:1101 ;
f:1100;
所以face的编码为:1100 0100 1101。
压缩前,属于等长编码,每个字符用3位编码足够表示,因为2位二进制只能表示2的2次方,也就是4个字符,3位二进制能表示8个字符,所以浪费了,所以采用霍夫曼编码可以压缩编码长度。压缩后编码长度为:1*45%+3*13%+3*12%+3*16%+4*9%+4*5%=2.24;
压缩率为:(3-2.24)/3≈25%;
故正确答案为:(1)A (2)B