要传输一则报文内容如下: “AAAAAAAAAAAAAAABBBBBBBBBCCCCCCCCDDDDDDDDDDDDEEEEEEEEEEFFFFF” 在这段报文中,各个字母出现的次数如下: 请为这段报文设计哈夫曼编码,要求如下: 使用c语言 请计算出每个字符出现的概率,并以概率为权重来构造哈夫曼树。 根据设计的哈夫曼树得到每个字符的哈夫曼编码。 请将上述设计哈夫曼编码的过程,用代码来实现,并输出各个字母的哈夫曼编码。 请分析算法的效率,如时间复杂度,空间复杂度,最差效率,最优效率,平均效率等。
时间: 2024-03-15 09:46:57 浏览: 159
第二代农信银支付清算系统报文交换标准:5.意见汇总处理表
首先,我们需要计算每个字符出现的概率,如下:
A: 14/40 = 0.35
B: 10/40 = 0.25
C: 8/40 = 0.2
D: 5/40 = 0.125
E: 3/40 = 0.075
F: 1/40 = 0.025
然后,我们可以构造哈夫曼树,根据概率来确定节点的权重。具体步骤如下:
1. 将所有字符看作一个节点,按照概率从小到大排序。
2. 取出概率最小的两个节点,合并成一个新节点,权重为这两个节点的概率之和。
3. 将新节点插入到已排序的节点中,继续按照概率从小到大排序。
4. 重复步骤2和3,直到只剩下一个节点,即为根节点。
通过构造哈夫曼树,我们可以得到每个字符的哈夫曼编码。具体步骤如下:
1. 从根节点开始,若左子节点则标记为0,若右子节点则标记为1。
2. 遍历到每个叶子节点,记录下路径上的标记,即为对应字符的哈夫曼编码。
下面是C语言的代码实现,输出每个字符的哈夫曼编码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 6
#define MAX_LEN 20
typedef struct HuffmanNode {
char ch;
float weight;
struct HuffmanNode *left;
struct HuffmanNode *right;
} HuffmanNode;
void calcProb(char *str, float *prob) {
int len = strlen(str);
for (int i = 0; i < len; i++) {
switch (str[i]) {
case 'A': prob[0] += 1; break;
case 'B': prob[1] += 1; break;
case 'C': prob[2] += 1; break;
case 'D': prob[3] += 1; break;
case 'E': prob[4] += 1; break;
case 'F': prob[5] += 1; break;
default: break;
}
}
for (int i = 0; i < MAX_N; i++) {
prob[i] /= len;
}
}
int findMin(HuffmanNode **nodes, int size) {
int minIdx = -1;
float minProb = 2;
for (int i = 0; i < size; i++) {
if (nodes[i] && nodes[i]->weight < minProb) {
minIdx = i;
minProb = nodes[i]->weight;
}
}
return minIdx;
}
HuffmanNode* createNode(char ch, float weight) {
HuffmanNode *node = (HuffmanNode*) malloc(sizeof(HuffmanNode));
node->ch = ch;
node->weight = weight;
node->left = NULL;
node->right = NULL;
return node;
}
HuffmanNode* buildHuffmanTree(float *prob) {
HuffmanNode *nodes[MAX_N];
for (int i = 0; i < MAX_N; i++) {
nodes[i] = createNode('A' + i, prob[i]);
}
int size = MAX_N;
while (size > 1) {
int idx1 = findMin(nodes, size);
HuffmanNode *node1 = nodes[idx1];
nodes[idx1] = NULL;
size--;
int idx2 = findMin(nodes, size);
HuffmanNode *node2 = nodes[idx2];
nodes[idx2] = NULL;
size--;
HuffmanNode *node = createNode(0, node1->weight + node2->weight);
node->left = node1;
node->right = node2;
nodes[size++] = node;
}
return nodes[0];
}
void printHuffmanCode(HuffmanNode *root, char *code, int len) {
if (!root) {
return;
}
if (root->ch) {
printf("%c: %s\n", root->ch, code);
return;
}
code[len] = '0';
printHuffmanCode(root->left, code, len + 1);
code[len] = '1';
printHuffmanCode(root->right, code, len + 1);
}
int main() {
char str[] = "AAAAAAAAAAAAAAABBBBBBBBBCCCCCCCCDDDDDDDDDDDDEEEEEEEEEEFFFFF";
float prob[MAX_N] = {0};
calcProb(str, prob);
HuffmanNode *root = buildHuffmanTree(prob);
char code[MAX_LEN] = {0};
printf("Huffman codes:\n");
printHuffmanCode(root, code, 0);
return 0;
}
```
该算法的时间复杂度为O(nlogn),其中n为字符集大小,即最多有n个节点。空间复杂度为O(n),即需要存储n个节点。最差效率和平均效率与数据本身有关,但哈夫曼编码通常可以极大地压缩数据,因此效率较高。最优效率为O(nlogn),即当每个字符的概率都相等时。
阅读全文