貪心、哈夫曼編碼——Entropy POJ - 1521
阿新 • • 發佈:2021-11-17
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; }