经统计,某机器14条指令的使用频度分别为0.01,0.15,0.12,0.03,0.02,0.04,0.02,0.04,0.01,0.13,0.15,0.14,0.11,0.03。分别求出用等长码、哈夫曼码、只有两种码长的扩展操作码等3种编码方式的操作码平均码长
时间: 2023-07-15 16:10:57 浏览: 716
1. 等长码
因为等长码是指每个操作码的码长都相等,所以平均码长为:
(1+1+1+1+1+1+1+1+1+1+1+1+1+1)/14 = 1
2. 哈夫曼码
首先,按照使用频度从小到大排列指令:
0.01,0.01,0.02,0.02,0.03,0.03,0.04,0.04,0.11,0.12,0.13,0.14,0.15,0.15
然后,依次将最小的两个频度合并为一组,直到只剩下一组为止。每次合并时,将两个频度相加作为新的频度,同时将这两个频度对应的哈夫曼编码加上一个“0”或“1”,表示左子树或右子树。
具体步骤如下:
- 将 0.01 和 0.01 合并,得到频度为 0.02 的节点,编码为 0;
- 将 0.02 和 0.02 合并,得到频度为 0.04 的节点,编码为 1;
- 将 0.03 和 0.03 合并,得到频度为 0.06 的节点,编码为 01;
- 将 0.04 和 0.04 合并,得到频度为 0.08 的节点,编码为 11;
- 将 0.06 和 0.08 合并,得到频度为 0.14 的节点,编码为 10;
- 将 0.11 和 0.12 合并,得到频度为 0.23 的节点,编码为 001;
- 将 0.13 和 0.14 合并,得到频度为 0.27 的节点,编码为 000;
- 将 0.15 和 0.15 合并,得到频度为 0.3 的节点,编码为 11。
最终得到哈夫曼编码表:
指令 | 频度 | 哈夫曼编码
---|---|---
0 | 0.01 | 0000
1 | 0.01 | 0001
2 | 0.02 | 0010
3 | 0.02 | 0011
4 | 0.03 | 010
5 | 0.03 | 011
6 | 0.04 | 100
7 | 0.04 | 101
8 | 0.11 | 1100
9 | 0.12 | 1101
10 | 0.13 | 1110
11 | 0.14 | 1111
12 | 0.15 | 100
13 | 0.15 | 101
计算平均码长:
(4\*0.01 + 4\*0.01 + 4\*0.02 + 4\*0.02 + 3\*0.03 + 3\*0.03 + 3\*0.04 + 3\*0.04 + 4\*0.11 + 4\*0.12 + 4\*0.13 + 4\*0.14 + 2\*0.15 + 2\*0.15)/14 = 2.85
3. 只有两种码长的扩展操作码
因为只有两种码长,所以可以用一个二进制数表示操作码,其中前面的若干位表示操作码的高位,后面的若干位表示操作码的低位。设高位的码长为 k,低位的码长为 l,则操作码的总码长为 k+l。
为了使平均码长最小,需要满足以下条件:
- 高位的码长 k 尽量小;
- 低位的码长 l 尽量小,且不小于 log2(n),其中 n 是指令的数量;
- 对于任意两个操作码,它们的高位码和低位码不能完全相同。
根据这些条件,可以得到以下编码方案:
- 高位码长为 2,低位码长为 4;
- 高位码表:
操作码 | 高位码
---|---
0 | 00
1 | 01
2 | 10
3 | 11
- 低位码表:
指令 | 低位码
---|---
0 | 0000
1 | 0100
2 | 1000
3 | 1100
4 | 0010
5 | 0110
6 | 1010
7 | 1110
8 | 0001
9 | 0101
10 | 1001
11 | 1101
12 | 0011
13 | 0111
计算平均码长:
(2\*0.01 + 2\*0.01 + 2\*0.02 + 2\*0.02 + 4\*0.03 + 4\*0.03 + 4\*0.04 + 4\*0.04 + 4\*0.11 + 4\*0.12 + 4\*0.13 + 4\*0.14 + 6\*0.15 + 6\*0.15)/14 = 3.14
综上所述,三种编码方式的操作码平均码长分别为:
- 等长码:1;
- 哈夫曼码:2.85;
- 只有两种码长的扩展操作码:3.14。
阅读全文