4034 - 哈夫曼编码

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

给定一个文本中n个字符的出现频率。设计n个字符的哈夫曼编码。

题目输入

输入包括多组数据。每组数据的第一行是一个整数n(1 <= n <= 100),代表不同字符的总数,n = 0意味着输入结束;接下来有n行,其中的每一行包含一个字符及其出现频率。

题目输出

对每组数据,输出哈夫曼编码的平均位数,即l1 * f1 + l2 * f2 + ... + ln * fn,其中li是第i个字符的哈夫曼编码的位数,fi是第i个字符出现的频率。

输入/输出样例

输入格式

5
A 35
B 10
C 20
D 20
_ 15
3
x 20
Y 50
Z 5
0

输出格式

225
100

C语言解答

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
	char symbol;
	int freq;
	int parent;
	int tag;
}NODE;

int main()
{
	NODE* tree;
	int i,j;
	int n;
	int min;
	int index1,index2;
	int depth;
	char ch;
	int sum;
	scanf("%d",&n);
	while(n>=1)
	{
	tree=(NODE*)malloc((2*n-1)*sizeof(NODE));
	for(i=0;i<n;i++)
	{
		scanf("%c%c%d",&ch,&tree[i].symbol,&tree[i].freq);
		tree[i].parent=-1;
		tree[i].tag=0;
	}
	for(i=n;i<2*n-1;i++)
	{
		min=RAND_MAX;
		for(j=0;j<i;j++)
		{
			if(tree[j].tag==0&&tree[j].freq<min)
		{
			min=tree[j].freq;
			index1=j;
			}
		}
		tree[index1].tag=1;
		min=RAND_MAX;
		for(j=0;j<i;j++)
		{
			if(tree[j].tag==0&&tree[j].freq<min)
		{
			min=tree[j].freq;
			index2=j;
			}
		}
		tree[index2].tag=1;
		tree[i].freq=tree[index1].freq+tree[index2].freq;
		tree[i].parent=-1;
		tree[i].tag=0;
		tree[index1].parent=i;
		tree[index2].parent=i;
		}
	sum=0;
	for(i=0;i<n;i++)
	{
		depth=0;
		j=i;
		while(tree[j].parent!=-1)
		{
			j=tree[j].parent;
			depth++;
		}
		sum+=depth*tree[i].freq;
	}
	printf("%d\n",sum);
	scanf("%d",&n);
	}
}

C++解答

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
	char symbol;
	int freq;
	int parent;
	int tag;
}NODE;

int main()
{
	NODE* tree;
	int i,j;
	int n;
	int min;
	int index1,index2;
	int depth;
	char ch;
	int sum;
	scanf("%d",&n);
	while(n>=1)
	{
	tree=(NODE*)malloc((2*n-1)*sizeof(NODE));
	for(i=0;i<n;i++)
	{
		scanf("%c%c%d",&ch,&tree[i].symbol,&tree[i].freq);
		tree[i].parent=-1;
		tree[i].tag=0;
	}
	for(i=n;i<2*n-1;i++)
	{
		min=RAND_MAX;
		for(j=0;j<i;j++)
		{
			if(tree[j].tag==0&&tree[j].freq<min)
		{
			min=tree[j].freq;
			index1=j;
			}
		}
		tree[index1].tag=1;
		min=RAND_MAX;
		for(j=0;j<i;j++)
		{
			if(tree[j].tag==0&&tree[j].freq<min)
		{
			min=tree[j].freq;
			index2=j;
			}
		}
		tree[index2].tag=1;
		tree[i].freq=tree[index1].freq+tree[index2].freq;
		tree[i].parent=-1;
		tree[i].tag=0;
		tree[index1].parent=i;
		tree[index2].parent=i;
		}
	sum=0;
	for(i=0;i<n;i++)
	{
		depth=0;
		j=i;
		while(tree[j].parent!=-1)
		{
			j=tree[j].parent;
			depth++;
		}
		sum+=depth*tree[i].freq;
	}
	printf("%d\n",sum);
	scanf("%d",&n);
	}
}