第六周作业1——利用哈夫曼编码英文字母表

来源:互联网 发布:运行python 批处理 编辑:程序博客网 时间:2024/04/20 21:38

作业要求: 对教材P167中习题5.18,思考并完成问题a-d。(原书PDF下载地址:算法概论[英文原版].pdf)

习题如下:



解:

(a): 

画出这些字母的最优二叉树:(根节点值为101不是100,应该是空格的出现频率18.3%有误,若改为17.3%就正确.但我已画完图,将错就错吧...)



根据叶子节点在其父节点的左侧为0, 在右侧为1,可知这些字母的最优Huffman编码是:

/* 字母表的最优Huffman编码e: 001blank: 110n: 0000i: 0001s: 0100h: 0101r: 0110a: 1000o: 1010t: 1110c: 01110u: 01111l: 10011d: 11110f: 100100w: 100101y: 101100g: 100101b: 100110p: 100111m: 111110v: 1111110k: 11111110x: 1111111100j: 1111111101q: 1111111110z: 1111111111*/

(b): 

有问题(a)可得, (3*2+4*8+5*4+6*7+7+8+10*4)/27 5.74 ;

即每个字母的编码平均需要6位.

(c): 

结果肯定比熵(约为5.74)要大,因为在计算熵的时候允许有小数个比特,而实际上每个字符的编码长度都必需为整数.

(d): 

我不认为这就是英文文本压缩的下限.

除了字母及其出现的频率,还可以重点考虑单词的前缀,后缀,某些常见字母的组合,甚至整个单词.

0 0