haitao:
刚才计算了一下,理想的压缩率应该是2.181818....
[阅读: 1406] 2005-06-27 14:49:17
在这个文件里:空格的概率最高,其余16个字符('0'-'9','A'-'F')的概率相同(假设足够随机),回车不计
则是:
' ':33.33%,0:4.1667%(2/3/16后同),1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
Hex
├' ':1/3 0
└tttt:2/3 1
├ttt:1/3 10
│├tt:1/6 100
││├t:1/12 1000
│││├F:1/24 10000
│││└E:1/24 10001
││└t:1/12 1001
││ ├D:1/24 10010
││ └C:1/24 10011
│└tt:1/6 101
│ ├t:1/12 1010
│ │├B:1/24 10100
│ │└A:1/24 10101
│ └t:1/12 1011
│ ├9:1/24 10110
│ └8:1/24 10111
└ttt:1/3 11
├tt:1/6 110
│├t:1/12 1100
││├7:1/24 11000
││└6:1/24 11001
│└t:1/12 1101
│ ├5:1/24 11010
│ └4:1/24 11011
└tt:1/6 111
├t:1/12 1110
│├3:1/24 11100
│└2:1/24 11101
└t:1/12 1111
├1:1/24 11110
└0:1/24 11111
1/3*1+(1/24*5)*16=11/3=3.667bit
理想的压缩率应该是24/11=2.18182!
哪里有霍夫曼编码的源代码。。。可以一洗4个人对我的冤枉。。。
操作码的优化。这要用到霍夫曼压缩的概念。霍夫曼压缩法是一种频率相关的编码方法,即出现频率高的字符编码短,频率低的字符编码长,这样可以缩短平均码长。我们要掌握的是用霍夫曼树实现霍夫曼编码。其方法很简单:
根据所给的各种指令使用频率,把它们从小到大依次排好作为叶结点(相同的频率可任取一个排在前),然后把最小的两个结点值(频率)相加,形成一个新结点,以这个结点的值与其他的叶结点值比较大小,仍旧取最小的两个结点值合并产生新结点,直到最终合并为一个根(通常这个值是1或100)。简单地记为:
从小到大排序,
最小两个合并,
重复上述过程,
只剩一个结束。
编码时,从根结点开始向下,凡左边分支都编为"1",右边分支都编为"0"(也可取反),则从根结点到叶结点的一条路径上的编码组合就是该指令的霍夫曼编码。(请仔细观察图4.12中的霍夫曼树)注意,霍夫曼树不是唯一的(因为相同的频率可以任取一个在前,且编码时又可任取左1或左0),但所得的平均码长应是一样的。由于霍夫曼编码得到的码长很不规整,所以有时候要采用霍夫曼扩展编码,就是在霍夫曼码的基础上对码长加以限制(取几个确定的长度如2位、4位等),对编码作适当改变。
平均码长应该容易计算吧,这也是要用到的。