作业要求:对教材P167中习题5.18,思考并完成问题a-d。
题目如图1-1所示:
1-1
注:本题数字有误,以下题目是将空格的概率改为17.3%做的。
(1)根据字母及空格出现的频率,可构造哈夫曼树,如图1-2
1-2
利用哈夫曼编码定义,可得出哈夫曼编码为:
z:1111011000
q:1111011001
x:1111011010
j: 1111011011
k:11110111
v:1111010
b:100100
p:100101
y:111100
g:101100
f:101101
w:111110
m:111111
u:01000
c:01001
l:10011
d:10111
r:0000
h:0001
s:0101
n:0110
i:0111
o:1000
a:1010
t:1110
e:001
空格:110
(2)根据哈夫曼树不难得出字母编码平均位数为:(10*4+8+7+6*7+5*4+4*8+3*2)/27=5.7407
(3)我认为熵的值比以上计算结果要大,因为每一个字母编码实际中是整数,而以上计算为小数。
(4)我认为不是。英文的复杂度比较高,譬如大家都有这个感受,你去翻译英语的时,很大一段英文翻译成中文也就几行而已,足以证明英文的冗余度比较高,即重复比较多,故我不认为利用字母压缩可以达到英文文本压缩的下线。我觉得应该按照英文词根,前后缀考虑,可以更好的压缩英文文本。
作业感想:构造哈夫曼树是个痛苦的过程.......刚开始看到那个算法只是觉得单纯的把树的高度往上加就可以了,不过坐到后面发现想法完全是错的,要选择“集合”中最小的元素构成二叉树,然后再找最小的俩,用visio做刚开始一大堆小的分支,真的是一步错,步步错。了解了熵的概念,不过香农大大留给我们了一串公式,用起来还是比较费事,可能是并没有足够理解熵的原因。
注:因后期检查发现哈夫曼树形成的时候空格(17.3%)与之相连的有错误,导致下面哈夫曼编码有误,请读者自行修改。
最后附上构造的哈夫曼树的下载地址:http://download.csdn.net/detail/bbyyo/7197653