10条指令I0到I9,使用频度为0.3 0.18 0.14 0.11 0.09 0.07 0.02 0.01 求信息熵
时间: 2024-06-02 09:09:28 浏览: 122
根据信息熵的公式:$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 的新节点:
![](https://i.imgur.com/HRJoQaC.png)
然后合并 I7 和新节点,得到一个频率为 0.07 的新节点:
![](https://i.imgur.com/8nLzNtM.png)
接着合并 I6 和新节点,得到一个频率为 0.12 的新节点:
![](https://i.imgur.com/P6XjZ1z.png)
再合并 I5 和新节点,得到一个频率为 0.2 的新节点:
![](https://i.imgur.com/9XNpX5s.png)
接着合并 I4 和新节点,得到一个频率为 0.29 的新节点:
![](https://i.imgur.com/mwQI9gW.png)
继续合并 I3 和新节点,得到一个频率为 0.41 的新节点:
![](https://i.imgur.com/sXQjzZP.png)
接着合并 I2 和新节点,得到一个频率为 0.55 的新节点:
![](https://i.imgur.com/3R6w1Yt.png)
再合并 I1 和新节点,得到一个频率为 0.72 的新节点:
![](https://i.imgur.com/8aYopQc.png)
最后合并 I0 和新节点,得到一棵完整的 Huffman 树:
![](https://i.imgur.com/3aVrnmH.png)
- 根据 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 编码比等长操作码编码更加紧凑。
假设信源X={x1,x2,x3,x4,x5,x6}对应频率P={0.40,0.20,0.12,0.11,0.09,0.08},对应概率给出码字,平均码长,编码效率
给出码字需要进行霍夫曼编码或者香农-费诺编码。这里以霍夫曼编码为例,步骤如下:
1. 将所有的事件按照概率从大到小排序,得到新的概率P'={0.40, 0.20, 0.12, 0.11, 0.09, 0.08},对应的事件为{a, b, c, d, e, f}。
2. 从P'中选取概率最小的两个事件,合并成一个新的事件,概率为它们的概率之和。对于霍夫曼编码,我们可以将概率小的事件编码为0,概率大的事件编码为1。因此,合并后的新事件的编码为1,对应的概率为0.17。
3. 重复步骤2,直到所有的事件都被合并成一个事件。
4. 对于每个事件,将它的编码表示为从根节点到该事件的路径上的0和1,路径上的0表示向左走,1表示向右走。例如,a的编码为0,b的编码为10,c的编码为110,d的编码为1110,e的编码为11110,f的编码为11111。
因此,信源X的霍夫曼编码为:
a: 0
b: 10
c: 110
d: 1110
e: 11110
f: 11111
平均码长可以通过每个事件的概率乘以它的编码长度,再对所有事件的结果求和来计算。即:
L = Σ P(i) * len(c(i))
其中,P(i)表示信源X发生事件xi的概率,len(c(i))表示事件xi的编码长度。
将信源X的概率和编码长度代入公式中,得到:
L = 0.40 * 1 + 0.20 * 2 + 0.12 * 3 + 0.11 * 4 + 0.09 * 5 + 0.08 * 5
计算结果为:
L ≈ 2.42 bits
因此,信源X的平均码长约为2.42比特。
编码效率可以用信源熵除以平均码长来计算。即:
η = H(X) / L
其中,H(X)为信源X的熵,L为平均码长。
将信源X的熵和平均码长代入公式中,得到:
η ≈ 2.455 / 2.42 ≈ 1.014
编码效率约为1.014。
阅读全文