1. 程式人生 > 其它 >貪心、哈夫曼編碼——Entropy POJ - 1521

貪心、哈夫曼編碼——Entropy POJ - 1521

https://vjudge.net/problem/POJ-1521
利用哈夫曼的思想,可以直接計算編碼的總長度,跳過編碼的過程。
哈夫曼編碼介紹

#include<iostream>
#include<queue>
#include<string>
#include<algorithm>
//#include<vector>並不需要

using namespace std;

int main(void) {
	string s;
	priority_queue< int, vector< int >, greater <int> > Q;
	//這種寫法表示升序排序,降序是less

	while(getline(cin, s) && s != "END"){
		int t = 1;
		sort(s.begin(), s.end());//對字串排序,方便計算字母頻次
		for (int i = 1; i < s.length(); i++) {
			if (s[i] != s[i - 1]) {//計算字母頻次
				Q.push(t);
				t = 1;
			}
			else
				t++;
		}
		Q.push(t);
		int ans = 0;
		if (Q.size() == 1) ans = Q.top();//哈夫曼無法處理一種字元,此時長度就是它的頻次
		while (Q.size() > 1) {//因為要連續取出兩個元素,所以不能用!Q.empty()
			int a = Q.top(); Q.pop();
			int b = Q.top(); Q.pop();
		//	printf("%d + %d\n", a, b);
			Q.push(a + b);
			ans += (a + b);
		}
		Q.pop();
		int ans2 = s.length() * 8;
		printf("%d %d %.1lf\n", ans2, ans, double(ans2) / ans);
	}



	return 0;
}