4.设在一篇文章中各字母出现的频率为: a :83: b :14: c :28: d :38: e :131: f :29: g :20: h :53. 给出其定长编码和哈夫曼编码方案,并计算分别需要多少位字符对该文章编码。 
时间: 2023-05-25 21:02:05 浏览: 14
定长编码方案:每个字母都分配一个相同的长度为 8 位的编码。
需要编码的总字符数 = 83 + 14 + 28 + 38 + 131 + 29 + 20 + 53 = 396
编码长度 = 8 位/字符
总共需要的位数 = 396 x 8 = 3168 位
哈夫曼编码方案:
首先,将各字母按出现频率从小到大排序,构建哈夫曼树:
接着,从哈夫曼树根节点开始,给左边的分支标上 0,给右边的分支标上 1,依此沿着树向下,给每个字母确定哈夫曼编码。最后,可以得到如下的哈夫曼编码:
a:1111
b:110110
c:101010
d:100100
e:0
f:101011
g:11010
h:1110
按照上表的哈夫曼编码,对文章进行编码:
需要编码的总字符数 = 396
总共需要的位数 = 83 x 4 + 14 x 6 + 28 x 6 + 38 x 6 + 131 x 1 + 29 x 6 + 20 x 5 + 53 x 4 = 2116 位
因此,使用哈夫曼编码方案可以将文章编码成 2116 位字符。相比较定长编码方案,哈夫曼编码方案可节省 1052 位字符,编码效率更高。
相关问题
设在一篇文章中各字母出现的频率为:a:83 b:14 c:28 d:38 e:131 f:29 g:20
h:61 i:71 j:2 k:8 l:47 m:27 n:74 o:80 p:19 q:1 r:60 s:63 t:93 u:27 v:13 w:16 x:1 y:18 z:1。请问这篇文章中一共有多少个字符?
A:将各字母的出现次数累加起来,得到总字符数为:83+14+28+38+131+29+20+61+71+2+8+47+27+74+80+19+1+60+63+93+27+13+16+1+18+1=852。
用C语言实现:4.利用指针分别统计一串字符中的大、小写字母的个数。
下面是用C语言实现统计一串字符中的大、小写字母的个数的代码:
```c
#include <stdio.h>
#include <ctype.h>
int main() {
char str[100];
int upper = 0, lower = 0;
char *p;
printf("请输入一串字符:");
fgets(str, 100, stdin);
p = str;
while (*p) {
if (isupper(*p)) {
upper++;
} else if (islower(*p)) {
lower++;
}
p++;
}
printf("大写字母个数:%d\n", upper);
printf("小写字母个数:%d\n", lower);
return 0;
}
```
首先,定义一个字符数组 `str` 存储输入的一串字符,定义两个变量 `upper` 和 `lower` 分别用于统计大写字母和小写字母的个数,定义一个字符指针 `p` 指向字符数组 `str`。
然后,使用 `fgets` 函数从标准输入(键盘)读取一串字符,最多读取 100 个字符,存储到 `str` 数组中。
接着,使用 `while` 循环遍历字符数组 `str` 中的每个字符,如果是大写字母,则 `upper` 自增 1,如果是小写字母,则 `lower` 自增 1。
最后,输出大写字母个数和小写字母个数。
需要注意的是,判断字符是否是大写字母或小写字母需要使用 `ctype.h` 头文件中的 `isupper` 和 `islower` 函数。
相关推荐
















