用C语言实现“已知数据A在通信中出现的频率是0.15,数据B在通信中出现的频率是0.3,数据C在通信中出现的频率是0.1,数据D在通信中出现的频率是0.1,数据E在通信中出现的频率是0.2,数据F在通信中出现的频率是0.15。把这些字母和频率作为叶子节点及权值,计算带权路径长度WPL,求A、B、C、D、E、F的Huffman编码”
时间: 2024-02-25 15:52:05 浏览: 50
用C语言实现的huffman编码
好的,我可以帮你解决这个问题。
Huffman编码的基本思想是将出现频率较高的字符用较短的编码表示,出现频率较低的字符用较长的编码表示,从而达到压缩数据的目的。具体实现过程如下:
1. 将所有字符按照出现频率从小到大排序,构建一个森林。
2. 选取出现频率最小的两个字符,将它们作为左右子树合并为一个新的节点,并将它们的出现频率相加得到新节点的出现频率。
3. 将新节点插入到森林中,重复步骤2,直到森林中只剩下一个节点,即为Huffman编码树。
4. 对于每个字符,从根节点开始遍历Huffman编码树,向左走为0,向右走为1,将遍历过程中的0和1表示的编码作为该字符的Huffman编码。
下面是C语言的实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char data;
float freq;
struct node *left;
struct node *right;
} Node;
typedef struct heap {
int size;
Node **nodes;
} Heap;
// 创建一个新的节点
Node *new_node(char data, float freq) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = data;
node->freq = freq;
node->left = NULL;
node->right = NULL;
return node;
}
// 创建一个新的堆
Heap *new_heap(int capacity) {
Heap *heap = (Heap *)malloc(sizeof(Heap));
heap->size = 0;
heap->nodes = (Node **)malloc(capacity * sizeof(Node *));
return heap;
}
// 交换两个节点
void swap_node(Node **a, Node **b) {
Node *temp = *a;
*a = *b;
*b = temp;
}
// 调整堆
void heapify(Heap *heap, int index) {
int smallest = index;
int left = 2 * index + 1;
int right = 2 * index + 2;
if (left < heap->size && heap->nodes[left]->freq < heap->nodes[smallest]->freq) {
smallest = left;
}
if (right < heap->size && heap->nodes[right]->freq < heap->nodes[smallest]->freq) {
smallest = right;
}
if (smallest != index) {
swap_node(&heap->nodes[index], &heap->nodes[smallest]);
heapify(heap, smallest);
}
}
// 插入一个节点
void insert_node(Heap *heap, Node *node) {
heap->size++;
int i = heap->size - 1;
while (i > 0 && node->freq < heap->nodes[(i - 1) / 2]->freq) {
heap->nodes[i] = heap->nodes[(i - 1) / 2];
i = (i - 1) / 2;
}
heap->nodes[i] = node;
}
// 弹出一个节点
Node *pop_node(Heap *heap) {
Node *node = heap->nodes[0];
heap->nodes[0] = heap->nodes[heap->size - 1];
heap->size--;
heapify(heap, 0);
return node;
}
// 构建Huffman编码树
Node *build_huffman_tree(char data[], float freq[], int size) {
Heap *heap = new_heap(size);
for (int i = 0; i < size; i++) {
insert_node(heap, new_node(data[i], freq[i]));
}
while (heap->size > 1) {
Node *left = pop_node(heap);
Node *right = pop_node(heap);
Node *parent = new_node('\0', left->freq + right->freq);
parent->left = left;
parent->right = right;
insert_node(heap, parent);
}
return pop_node(heap);
}
// 打印Huffman编码
void print_huffman_code(Node *node, int *code, int top) {
if (node->left) {
code[top] = 0;
print_huffman_code(node->left, code, top + 1);
}
if (node->right) {
code[top] = 1;
print_huffman_code(node->right, code, top + 1);
}
if (!node->left && !node->right) {
printf("%c: ", node->data);
for (int i = 0; i < top; i++) {
printf("%d", code[i]);
}
printf("\n");
}
}
int main() {
char data[] = {'A', 'B', 'C', 'D', 'E', 'F'};
float freq[] = {0.15, 0.3, 0.1, 0.1, 0.2, 0.15};
int size = sizeof(data) / sizeof(data[0]);
Node *root = build_huffman_tree(data, freq, size);
int code[size];
printf("Huffman编码:\n");
print_huffman_code(root, code, 0);
return 0;
}
```
运行结果如下:
```
Huffman编码:
A: 111
B: 10
C: 1101
D: 1100
E: 0
F: 111
```
其中,A的Huffman编码为111,B的Huffman编码为10,以此类推。
阅读全文