1. 程式人生 > >Entropy (哈夫曼樹)

Entropy (哈夫曼樹)

題目連結

思路

純資料結構。

程式碼

#include <iostream>
#include <cstdio>
#include <map>
#include <queue>
#include <cstring>

using namespace std;

struct node
{
    char ch;
    int num;
    int ls, rs;
} tree[100];
struct cmp
{
    bool operator()(int &a, int &b)
    {
        return
tree[a].num>tree[b].num; } }; char text[1000]; void traversal(int root, int count, map<char, int> & table) { if(!tree[root].ls&&!tree[root].rs) { table[tree[root].ch] = count; } else { if(tree[root].ls) traversal(tree[root].ls, count+1, table); if
(tree[root].rs) traversal(tree[root].rs, count+1, table); } } void slove() { map<char ,int> count; int nCount = 0; int len = strlen(text); for(int i=0; i<len; i++) count[text[i]]++; priority_queue<int, vector<int>, cmp> qu; for(map<char, int>::iterator it=count.begin(); it!=count.end(); it++) { tree[++nCount].ch = (*it).first; tree[nCount].num = (*it).second; tree[nCount].ls = tree[nCount].rs = 0
; qu.push(nCount); } if(qu.size()==1) { printf("%d %d %.1f\n", len*8, len, 8.0); } else { int a, b; while(!qu.empty()) { a = qu.top(); qu.pop(); if(qu.empty()) break; b = qu.top(); qu.pop(); tree[++nCount].num = tree[a].num + tree[b].num; tree[nCount].ls = a; tree[nCount].rs = b; qu.push(nCount); } map<char, int> table; traversal(nCount, 0, table); int sum = 0; for(map<char, int>::iterator it=count.begin(); it!=count.end(); it++) { sum += (table[(*it).first]*((*it).second)); } printf("%d %d %.1f\n", len*8, sum, (double)len*8/sum); } } int main() { while(gets(text)) { if(strcmp(text, "END")==0) break; else { slove(); } } return 0; }