构造哈夫曼树和哈夫曼编码的算法实现

本文介绍了如何统计英文字符频率并利用这些数据构建哈夫曼树和哈夫曼编码。实验内容包括分析一段英文文本,识别不同字符及其出现频率,然后详细阐述了实现这一过程的代码步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、实验内容:

统计下面一段英文的不同字符个数和每个字符的出现频率,利用统计数据构造构造哈夫曼树和哈夫曼编码
The Chinese official said he viewed the Trump Presidency not as an aberration but as the product of a failing political system. This jibes with other accounts. The Chinese leadership believes that the United States, and Western democracies in general, haven’t risen to the challenge of a globalized economy, which necessitates big changes in production patterns, as well as major upgrades in education and public infrastructure. In Trump and Trumpism, the Chinese see an inevitable backlash to this failure.

2、实现代码:

#include <iostream>
#include<cstring>
#include<string.h>

using namespace std;
struct Tag
{
   
   
	char ch;  //字符
	int value;  //频率
}T[100];
typedef struct
{
   
   
	int weight;
	int parent, lchild, rchild;
}HTNode, *HuffmanTree;
typedef char **HuffmanCode;

bool Judge(char temp, int j)//判断是否重复
{
   
   
	for (int i = 0; i < j; i++)
		if (T[i].ch == temp) return true; //重复
	return false;
}
//统计下面一段英文的不同字符个数和每个字符的出现频率
int GetCount(char *str)//写入每种字符及其出现频率
{
   
   
	int j = 0;
	for (int i = 0; i < 1000; i++)
	{
   
   
		char temp= str[i];
		if (!Judge(temp, j))
		{
   
   
			T[j].ch = temp;
			T[j]
好的,下面构造哈夫曼哈夫曼编码算法构造哈夫曼算法: 1. 初始化一个权值数组 `w[]`,其中 `w[i]` 表示第 `i` 个叶子节点的权值。 2. 创建一个哈夫曼森林,即将每个叶子节点看作是一个单独的。 3.哈夫曼森林中选取两个根节点权值最小的,合并成一棵新的,根节点的权值为两个子根节点权值之4. 将新的插入哈夫曼森林中,并删除原来的两棵。 5. 重复步骤3步骤4,直到哈夫曼森林中只剩下一棵,即为哈夫曼下面是求哈夫曼编码算法: 1. 对于哈夫曼每个叶子节点,将其从叶子节点向上遍历到根节点的路径上的所有边进行编号,规定左孩子为0,右孩子为1,得到该叶子节点的哈夫曼编码。 2. 对于哈夫曼中的每个叶子节点,将其权值哈夫曼编码存储在一个编码表中。 下面是 C 语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLEN 100 // 最大编码长度 typedef struct { int weight; // 权值 int parent, lchild, rchild; // 双亲左右孩子指针 } HTNode, *HuffmanTree; typedef char *HuffmanCode[MAXLEN]; // 动态数组存储哈夫曼编码 // 选择权值最小的两个节点 void Select(HuffmanTree HT, int n, int *s1, int *s2) { int i, min1, min2; min1 = min2 = 0; for (i = 1; i <= n; i++) { if (HT[i].parent == 0) { if (HT[i].weight < HT[min1].weight) { min2 = min1; min1 = i; } else if (HT[i].weight < HT[min2].weight) { min2 = i; } } } *s1 = min1; *s2 = min2; } // 构造哈夫曼 void CreateHuffmanTree(HuffmanTree *HT, int n) { int i, s1, s2; if (n <= 1) { return; } int m = 2 * n - 1; *HT = (HuffmanTree) malloc((m + 1) * sizeof(HTNode)); // 分配空间 for (i = 1; i <= m; i++) { // 初始化 (*HT)[i].parent = (*HT)[i].lchild = (*HT)[i].rchild = 0; (*HT)[i].weight = 0; } for (i = 1; i <= n; i++) { // 输入权值 scanf("%d", &(*HT)[i].weight); } for (i = n+1; i <= m; i++) { // 构造哈夫曼 Select(*HT, i-1, &s1, &s2); (*HT)[s1].parent = i; (*HT)[s2].parent = i; (*HT)[i].lchild = s1; (*HT)[i].rchild = s2; (*HT)[i].weight = (*HT)[s1].weight + (*HT)[s2].weight; } } // 生成哈夫曼编码 void HuffmanCoding(HuffmanTree HT, HuffmanCode HC, int n) { char *cd = (char *) malloc(n * sizeof(char)); // 暂存编码 cd[n-1] = '\0'; int i, c, p; for (i = 1; i <= n; i++) { // 逐个叶子节点求哈夫曼编码 int start = n - 1; for (c = i, p = HT[i].parent; p != 0; c = p, p = HT[p].parent) { if (HT[p].lchild == c) { cd[--start] = '0'; } else { cd[--start] = '1'; } } HC[i-1] = (char *) malloc((n - start) * sizeof(char)); strcpy(HC[i-1], &cd[start]); // 复制编码 } free(cd); // 释放空间 } int main() { int n, i; printf("请输入叶子节点的个数:"); scanf("%d", &n); HuffmanTree HT; HuffmanCode HC; CreateHuffmanTree(&HT, n); HuffmanCoding(HT, HC, n); printf("哈夫曼编码如下:\n"); for (i = 0; i < n; i++) { printf("%d: %s\n", i+1, HC[i]); } free(HT); for (i = 0; i < n; i++) { free(HC[i]); } return 0; } ``` 输入格式: 第一行输入叶子节点的个数 `n`。 接下来一行输入 `n` 个整数,表示每个叶子节点的权值。 输出格式: 输出每个叶子节点的哈夫曼编码。 希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值