杭电hdu 1053 Entropy题解

http://acm.hdu.edu.cn/showproblem.php?pid=1053

这题就是运用哈夫曼的编码思想,然后统计用哈夫曼编码后的二进制长度,以及运用ascii编码长度的比较。我在这题上感觉统计无从下手,虽然知道哈夫曼的贪心实现,但真正的到运用的时候了,却一时想不起应该怎么用代码去实现,进过参考别人用优先队列写的代码,我也写出了我自己的代码。现记录在下面。做个在编程上的参考。

#include 
#include 

using namespace std;

int num[27];

void init()
{
	int i;
	for(i = 0; i < 27; i ++){
		num[i] = 0;
	}
}

int fun()
{
	int n = 0,i,j,l;
	sort(num, num+27);
	int tmp[27],k = 0;
	for(i = 0; i < 27; i ++){
		if(num[i] != 0)break;
	}
	l = 27-i;
	if(l == 1)return num[26];

	for(i = 27-l; i < 27; i ++){
		tmp[k++] = num[i];
//		printf("tmp[%d] = %d\n", k-1, tmp[k-1]);
	}

	for(i = 0; i < l - 1; i ++){
		if(i%2==0){
			num[0] = tmp[0] + tmp[1];
			n+=num[0];
			for(j = 2; j < k; j ++){
				num[j-1] = tmp[j];
			}
			k--;
			sort(num, num+k);
		}
		else{
			tmp[0] = num[0]+num[1];
			n+=tmp[0];
			for(j = 2; j < k; j ++){
				tmp[j-1] = num[j];
			}
			k--;
			sort(tmp, tmp+k);
		}
	}
	return n;
}

char str[1001];

int main()
{
	int len,i;
	int original, now;
	while(scanf("%s", str)&&strcmp(str,"END")!=0){
		init();
		len = strlen(str);
		for(i = 0; i < len; i ++){
			if(str[i]-'A'<26){
				num[str[i]-'A'] ++;
			}
			else {
				num[26] ++;
			}
		}
		original = 8*len;
		now = fun();
		printf("%d %d %.1lf\n", original, now, 1.0*original/now);
	}
	return 0;
}


你可能感兴趣的:(哈夫曼编码)