15. 计算WPL

15. 计算WPL

成绩 10 开启时间 2014年11月26日 Wednesday 17:25
折扣 0.8 折扣时间 2014年12月7日 Sunday 23:55
允许迟交 关闭时间 2014年12月14日 Sunday 23:55

Huffman编码是通信系统中常用的一种不等长编码,它的特点是:能够使编码之后的电文长度最短。

输入:
    第一行为要编码的符号数量n
    第二行~第n+1行为每个符号出现的频率

输出:
    对应哈夫曼树的带权路径长度WPL

  测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示
  1. 5↵
  2. 7↵
  3. 5↵
  4. 2↵
  5. 4↵
  6. 9↵
以文本方式显示
  1. WPL=60↵
1秒 64M 0
测试用例 2 以文本方式显示
  1. 5↵
  2. 2↵
  3. 4↵
  4. 2↵
  5. 3↵
  6. 3↵
以文本方式显示
  1. WPL=32↵
1秒 64M 0
#include
#include
typedef struct{
	unsigned int weight;
	unsigned int parent, lchild, rchild;
}HTNode, *HuffmanTree;
int min1, min2;
int w[10000];
void Select(HuffmanTree &HT, int i)
{
	int flag = 1200000000;
	int j;
	min1 = 0; min2 = 0;
	for (j = 0; j <= i; j++){
		if (HT[j].parent == 0 && HT[j].weight < flag){
			min1 = j;
			flag = HT[j].weight;
		}
	}
	flag = 1200000000;
	for (j = 0; j <= i; j++){
		if (HT[j].parent == 0 && HT[j].weight < flag){
			if (j != min1){
				min2 = j;
				flag = HT[j].weight;
			}
		}
	}
}
void BuildHuffmanTree(HuffmanTree &HT, int *w, int n)
{
	int m;
	int i;
	HuffmanTree p;
	m = 2 * n - 1;
	HT = (HuffmanTree)malloc((m + 1)*sizeof(HTNode));
	for (p = HT, i = 1; i <= n; ++i, ++p, ++w)
		*p = { *w, 0, 0, 0 };
	for (; i <= m+1; ++i, ++p)
		*p = { 0, 0, 0, 0 };
	for (i = n; i < m; ++i){
		Select(HT, i - 1);
		HT[min1].parent = i;
		HT[min2].parent = i;
		HT[i].lchild = min1;
		HT[i].rchild = min2;
		HT[i].weight = HT[min1].weight + HT[min2].weight;
	}
}
int Count(HuffmanTree &HT, int n)
{
	int count=0, flag;
	int i;
	for (i = 0; i < n; i++){
		flag = i;
		while (HT[flag].parent != 0){
			count += HT[i].weight;
			flag = HT[flag].parent;
		}
	}
	return count;
}
int main()
{
	int n;
	int i;
	int WPL;
	HuffmanTree HT;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
		scanf("%d", &w[i]);
	BuildHuffmanTree(HT, w, n);
	if (n == 1)
		printf("WPL=%d\n", w[0]);
	else{
		WPL = Count(HT, n);
		printf("WPL=%d\n", WPL);
	}
	return 0;
}

你可能感兴趣的:(BIT数据结构习题)