通过给定字符a、b、c、d、e、f、g的使用频率,c语言编程求出它们的赫夫曼编码,写一段完整代码
时间: 2024-11-30 11:20:49 浏览: 39
赫夫曼编码是一种基于贪心算法的二叉树编码方法,用于数据压缩。对于给定字符及其频率,首先构建一个优先队列(最小堆),然后将频率最高的元素作为第一个节点添加,并标记为已处理。接下来,每次从堆中取出两个频率最低的节点合并成一个新的节点,新节点的频率等于两子节点的频率之和,新节点作为左孩子的是原来频率较低的那个。这个过程持续直到只剩下一个节点,即根节点,它就是完整的赫夫曼树。最后,从根节点开始遍历,每个叶子节点对应一个字符,根据路径上遇到的0和1生成其对应的编码。
下面是一个简单的C语言函数,假设`freq[]`存储了字符的频率,`chars[]`存储了所有字符:
```c
#include <stdio.h>
#include <stdlib.h>
#include <queue>
typedef struct Node {
char ch;
int freq;
struct Node* left, *right;
} Node;
Node* newNode(char ch, int freq) {
Node* node = (Node*)malloc(sizeof(Node));
node->ch = ch;
node->freq = freq;
node->left = NULL;
node->right = NULL;
return node;
}
void heapify(Node** root, int size, int i) {
int smallest = i;
int l = 2 * i + 1;
int r = 2 * i + 2;
if (l < size && freq[root[l]->ch] < freq[root[smallest]->ch])
smallest = l;
if (r < size && freq[root[r]->ch] < freq[root[smallest]->ch])
smallest = r;
if (smallest != i) {
Node* temp = root[i];
root[i] = root[smallest];
root[smallest] = temp;
heapify(root, size, smallest);
}
}
Node* buildHuffmanTree(int freq[], int n) {
priority_queue<Node*, vector<Node*>, greater<Node*>> huffmanHeap;
for (int i = 0; i < n; i++) {
huffmanHeap.push(newNode(chars[i], freq[i]));
}
while (huffmanHeap.size() > 1) {
Node* left = huffmanHeap.top();
huffmanHeap.pop();
Node* right = huffmanHeap.top();
huffmanHeap.pop();
Node* newRoot = newNode('\0', left->freq + right->freq);
newRoot->left = left;
newRoot->right = right;
heapify(&huffmanHeap, huffmanHeap.size(), 0);
}
return huffmanHeap.top();
}
void printCodes(Node* root, const char* prefix, char codes[]) {
if (!root)
return;
if (root->left == NULL && root->right == NULL) {
codes[root->ch] = prefix;
printf("%c: %s\n", root->ch, prefix);
} else {
printCodes(root->left, prefix + "0", codes);
printCodes(root->right, prefix + "1", codes);
}
}
int main() {
char chars[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
int freq[] = {10, 20, 30, 40, 50, 60, 70}; // 假设这是字符频率
int n = sizeof(chars) / sizeof(chars[0]);
Node* root = buildHuffmanTree(freq, n);
char codes[256] = {0};
printCodes(root, "", codes);
printf("赫夫曼编码:\n");
for (char ch : chars) {
printf("%c: %s\n", ch, codes[ch]);
}
return 0;
}
```
这个代码会打印出每个字符及其对应的赫夫曼编码。注意,这里假设输入的字符集固定且不会超过256个。实际应用中,你可能需要调整`codes[]`数组的大小以适应更大的字符集。
阅读全文