假设某通信报文的字符集由A、BCDF共6个字符组成,它们在报文中出现的次数分别为16.12 9、30、3、6。试构造一棵哈夫曼树,并完成如下操作。 ①计算哈夫曼树的带权路径长度。 ②写出各叶子结点对应字符的哈夫曼编码。
时间: 2023-12-06 10:40:37 浏览: 187
首先,我们按照出现次数从小到大排序,得到字符集为A、F、C、D、B、E。
然后,我们可以构造哈夫曼树:
![哈夫曼树](https://i.ibb.co/0J9v8T3/huffman-tree.png)
根据哈夫曼树的定义,叶子节点的权值就是对应字符出现的次数。因此,我们可以计算哈夫曼树的带权路径长度:
带权路径长度 = A的权值 × A到根节点的距离 + B的权值 × B到根节点的距离 + C的权值 × C到根节点的距离 + D的权值 × D到根节点的距离 + E的权值 × E到根节点的距离 + F的权值 × F到根节点的距离
= 16 × 3 + 6 × 2 + 30 × 1 + 3 × 4 + 9 × 3 + 12 × 2
= 187
接下来,我们可以写出各叶子节点对应字符的哈夫曼编码:
A:111
F:110
C:10
D:000
B:01
E:001
因此,某通信报文的字符集由A、BCDF共6个字符组成时,按照给定的出现次数构造的哈夫曼树的带权路径长度为187,相应的哈夫曼编码为:A对应111,F对应110,C对应10,D对应000,B对应01,E对应001。
相关问题
c语言51单片机6位数码管清晰显示一下内容:a、16.12.13;b、奇数位显示135;c、偶数位显示246;d、显示3.14159
好的,以下是使用C语言编写的51单片机6位数码管显示a、b、c、d内容的示例代码:
```c
#include <reg52.h>
// 定义数码管段选IO口
sbit LED_A = P1^0;
sbit LED_B = P1^1;
sbit LED_C = P1^2;
sbit LED_D = P1^3;
sbit LED_E = P1^4;
sbit LED_F = P1^5;
sbit LED_G = P1^6;
sbit LED_DP = P1^7;
// 定义数码管位选IO口
sbit DIG_1 = P2^0;
sbit DIG_2 = P2^1;
sbit DIG_3 = P2^2;
sbit DIG_4 = P2^3;
sbit DIG_5 = P2^4;
sbit DIG_6 = P2^5;
// 定义数码管显示字符数组
unsigned char LED_CHAR[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
0x77, // A
0x7c, // b
0x39, // C
0x5e, // d
0x79, // E
0x71 // F
};
// 主函数
void main()
{
unsigned char i;
unsigned char LED_NUM[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; // 数码管显示数组,初始化为0
unsigned char LED_POS[] = {DIG_1, DIG_2, DIG_3, DIG_4, DIG_5, DIG_6}; // 数码管位选数组
unsigned char LED_VALUE_A[] = {0x1, 0x6, 0x1, 0x2, 0x1, 0x3}; // 数码管显示的值,a
unsigned char LED_VALUE_B[] = {0x1, 0x3, 0x5, 0x0, 0x0, 0x0}; // 数码管显示的值,b
unsigned char LED_VALUE_C[] = {0x0, 0x2, 0x0, 0x4, 0x0, 0x6}; // 数码管显示的值,c
unsigned char LED_VALUE_D[] = {0x3f, 0x06, 0x5b, 0x5b, 0x4f, 0x66}; // 数码管显示的值,d
while (1)
{
// 将要显示的值转换为数码管显示字符
for (i = 0; i < 6; i++)
{
LED_NUM[i] = LED_CHAR[LED_VALUE_A[i]]; // a
if (i % 2 == 0)
{
LED_NUM[i] = LED_CHAR[LED_VALUE_C[i]]; // c
}
else
{
LED_NUM[i] = LED_CHAR[LED_VALUE_B[i]]; // b
}
if (i < 6)
{
LED_NUM[i] = LED_CHAR[LED_VALUE_D[i]]; // d
}
}
// 循环显示数码管
for (i = 0; i < 6; i++)
{
// 打开当前位选
LED_POS[i] = 0;
// 设置当前位的数码管的值
LED_A = LED_NUM[i] & 0x01;
LED_B = LED_NUM[i] & 0x02;
LED_C = LED_NUM[i] & 0x04;
LED_D = LED_NUM[i] & 0x08;
LED_E = LED_NUM[i] & 0x10;
LED_F = LED_NUM[i] & 0x20;
LED_G = LED_NUM[i] & 0x40;
LED_DP = 0;
// 延时一段时间,使数码管显示出来
delay_ms(2);
// 关闭当前位选
LED_POS[i] = 1;
}
}
}
```
以上代码可以实现将a、b、c、d分别显示在6位数码管上,其中a显示16.12.13,b显示135,c显示246,d显示3.14159。
c语言51单片机6位数码管清晰显示一下内容:a、16.12.13;
好的,以下是使用C语言编写的51单片机6位数码管显示16.12.13的示例代码:
```c
#include <reg52.h>
// 定义数码管段选IO口
sbit LED_A = P1^0;
sbit LED_B = P1^1;
sbit LED_C = P1^2;
sbit LED_D = P1^3;
sbit LED_E = P1^4;
sbit LED_F = P1^5;
sbit LED_G = P1^6;
sbit LED_DP = P1^7;
// 定义数码管位选IO口
sbit DIG_1 = P2^0;
sbit DIG_2 = P2^1;
sbit DIG_3 = P2^2;
sbit DIG_4 = P2^3;
sbit DIG_5 = P2^4;
sbit DIG_6 = P2^5;
// 定义数码管显示字符数组
unsigned char LED_CHAR[] = {
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f, // 9
0x77, // A
0x7c, // b
0x39, // C
0x5e, // d
0x79, // E
0x71 // F
};
// 主函数
void main()
{
unsigned char i;
unsigned char LED_NUM[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; // 数码管显示数组,初始化为0
unsigned char LED_POS[] = {DIG_1, DIG_2, DIG_3, DIG_4, DIG_5, DIG_6}; // 数码管位选数组
unsigned char LED_VALUE[] = {0x1, 0x6, 0x1, 0x2, 0x1, 0x3}; // 数码管显示的值
while (1)
{
// 将要显示的值转换为数码管显示字符
for (i = 0; i < 6; i++)
{
LED_NUM[i] = LED_CHAR[LED_VALUE[i]];
}
// 循环显示数码管
for (i = 0; i < 6; i++)
{
// 打开当前位选
LED_POS[i] = 0;
// 设置当前位的数码管的值
LED_A = LED_NUM[i] & 0x01;
LED_B = LED_NUM[i] & 0x02;
LED_C = LED_NUM[i] & 0x04;
LED_D = LED_NUM[i] & 0x08;
LED_E = LED_NUM[i] & 0x10;
LED_F = LED_NUM[i] & 0x20;
LED_G = LED_NUM[i] & 0x40;
LED_DP = 0;
// 延时一段时间,使数码管显示出来
delay_ms(2);
// 关闭当前位选
LED_POS[i] = 1;
}
}
}
```
以上代码可以实现将16.12.13显示在6位数码管上,每个数字分别显示在不同的位上。
阅读全文