10条指令I0到I9,使用频度为0.3 0.18 0.14 0.11 0.09 0.07 0.02 0.01 求信息熵
时间: 2024-06-02 14:09:28 浏览: 124
根据信息熵的公式:$H=-\sum_{i=1}^{n} p_i \log_2 p_i$,其中 $p_i$ 表示第 $i$ 个事件发生的概率,$n$ 表示事件的总数。
将给定的指令按照概率从大到小排列,得到:
| 指令 | I0 | I1 | I2 | I3 | I4 | I5 | I6 | I7 | I8 | I9 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 概率 | 0.3 | 0.18 | 0.14 | 0.11 | 0.09 | 0.07 | 0.02 | 0.01 | - | - |
由于最后两个事件的概率为 0,因此可以忽略不计。
将上表中的概率代入信息熵公式,得到:
$$
\begin{aligned}
H &= -0.3 \log_2 0.3 - 0.18 \log_2 0.18 - 0.14 \log_2 0.14 \\
&\quad- 0.11 \log_2 0.11 - 0.09 \log_2 0.09 - 0.07 \log_2 0.07 \\
&\quad- 0.02 \log_2 0.02 - 0.01 \log_2 0.01 \\
&\approx 2.604
\end{aligned}
$$
因此,这些指令的信息熵约为 2.604。
相关问题
某模型机有 10 条指令 I0~I9,它们的使用频度分别为:0.28,0.17, 0.14,0.12,0.09,0.08,0.05,0.04,0.02,0.0l 。 (1)计算 10 条指令 I0~I9的信息熵 H。 (2)计算采用等长操作码编码时的平均长度 L1和编码冗余量 R1。 (3)设计该指令集的 Huffman 编码,画出 Huffman 树,并计算所设计 Huffman 编码的平均长度 L2和编码冗余量 R2。
(1) 信息熵的计算公式为:$H = - \sum_{i=0}^{9} p_i \log_2 p_i$,其中 $p_i$ 表示第 $i$ 条指令的使用频率。
代入数据得,$H = -0.28\log_2 0.28 - 0.17\log_2 0.17 - \cdots - 0.01\log_2 0.01 \approx 3.055$。
(2) 采用等长操作码编码时,每条指令编码长度相同,即 $L1 = \log_2 10 \approx 3.322$。
编码冗余量 $R1 = L1 - H \approx 0.267$。
(3) 设计 Huffman 编码的步骤如下:
- 按照使用频率从小到大排序,得到以下表格:
| 指令 | 使用频率 |
| ---- | -------- |
| I9 | 0.01 |
| I8 | 0.02 |
| I7 | 0.04 |
| I6 | 0.05 |
| I5 | 0.08 |
| I4 | 0.09 |
| I3 | 0.12 |
| I2 | 0.14 |
| I1 | 0.17 |
| I0 | 0.28 |
- 将频率最小的两个节点合并,并将它们的频率相加,得到一个新节点。重复此步骤,直到只剩下一个节点为止。合并的过程可以用一棵树来表示,称为 Huffman 树。
首先合并 I9 和 I8,得到一个频率为 0.03 的新节点:

然后合并 I7 和新节点,得到一个频率为 0.07 的新节点:

接着合并 I6 和新节点,得到一个频率为 0.12 的新节点:

再合并 I5 和新节点,得到一个频率为 0.2 的新节点:

接着合并 I4 和新节点,得到一个频率为 0.29 的新节点:

继续合并 I3 和新节点,得到一个频率为 0.41 的新节点:

接着合并 I2 和新节点,得到一个频率为 0.55 的新节点:

再合并 I1 和新节点,得到一个频率为 0.72 的新节点:

最后合并 I0 和新节点,得到一棵完整的 Huffman 树:

- 根据 Huffman 树,对每个节点进行编码。从根节点开始,向左走为编码 0,向右走为编码 1。最终得到以下表格:
| 指令 | 使用频率 | Huffman 编码 |
| ---- | -------- | ------------ |
| I9 | 0.01 | 1111111110 |
| I8 | 0.02 | 1111111111 |
| I7 | 0.04 | 111111100 |
| I6 | 0.05 | 11111100 |
| I5 | 0.08 | 111110 |
| I4 | 0.09 | 11110 |
| I3 | 0.12 | 1110 |
| I2 | 0.14 | 110 |
| I1 | 0.17 | 10 |
| I0 | 0.28 | 0 |
- 计算 Huffman 编码的平均长度 $L2$ 和编码冗余量 $R2$。
平均长度 $L2 = \sum_{i=0}^{9} p_i l_i$,其中 $l_i$ 表示第 $i$ 条指令的 Huffman 编码长度。
代入数据得,$L2 = 0.01 \times 10 + 0.02 \times 10 + \cdots + 0.28 \times 1 \approx 2.65$。
编码冗余量 $R2 = L2 - H \approx -0.405$,说明 Huffman 编码比等长操作码编码更加紧凑。
现有 8 个待编码的符号 m0,……,m7,它们的概率分别为 0.10,0.02,0.28,0.14,0.19,0.05,0.06,0.15,试给出哈夫曼编码与二分法香农 范诺编码过程及码字,求出其信息熵,平均码长和编码效率。matlab
首先,让我们逐步解释哈夫曼编码和二分法香农-范诺编码的过程,并计算所需的信息熵、平均码长和编码效率。
**哈夫曼编码过程:**
1. **构建哈夫曼树**: 对给定的符号按概率从大到小排序,每次选择概率最小的两个节点合并成一个新的节点,新节点的概率为其左右子节点概率之和。重复此过程直到只剩下一个叶子节点,即得到的是一棵完全二叉树。
2. **编码生成**: 根据哈夫曼树,从根开始遍历每个叶节点,遇到左分支加0,右分支加1,形成对应的二进制码字。由于它是动态生成的,所以需要对每个符号分配特定的二进制码。
3. **计算信息熵**: 对于每个符号,信息熵是其概率取以自然对数然后乘以-1。最后所有符号的信息熵相加得到总信息熵。
**二分法香农-范诺编码过程:**
1. 将符号按照概率大小排序。
2. 从最低概率的符号开始,依次将每个符号作为前缀码的基础,添加最小的前缀使其唯一。例如,第一个是最短的"0",第二个可能是"10",第三个是"110"等。
3. 生成的每个符号都有一个唯一的前缀码。
**信息熵计算:**
在MATLAB中,你可以使用以下公式来计算信息熵 H(X):
```matlab
prob = [0.10, 0.02, 0.28, 0.14, 0.19, 0.05, 0.06, 0.15]; % 符号概率数组
H = -sum(prob .* log2(prob)); % 信息熵计算
```
**平均码长计算:**
对于哈夫曼编码,我们需要知道所有符号的码长然后求平均值。这通常涉及到查找哈夫曼树的路径长度并求和。在MATLAB中可以手动实现或利用一些库函数。
```matlab
% 假设已经得到了哈夫曼树,可以用以下代码计算平均码长
avg_code_length = mean(huffman_code_lengths); % huffman_code_lengths是对应符号的码长向量
% 对于二分法香农-范诺编码,直接用前缀码的平均长度即可
avg_van_noy_code_length = mean(prefix_codes);
```
**编码效率:**
编码效率(也称压缩比)通常是编码后的数据长度除以原始数据长度。在哈夫曼编码中,因为数据被压缩了,所以效率会高于1。而在香农-范诺编码中,虽然不是最优,但通常会有一定的压缩效果。
```matlab
if iscell(huffman_code_lengths)
efficiency_Huffman = sum(huffman_code_lengths) / length(prob);
else
efficiency_Huffman = avg_code_length / sum(prob);
end
efficiency_Van_Noy = avg_van_noy_code_length / sum(prob);
```
请注意,实际在MATLAB中计算这些值可能需要手动创建哈夫曼树或使用专门的库函数。以上步骤仅提供了基本的概念和公式。
阅读全文
相关推荐
















