Entropy (哈夫曼樹)
阿新 • • 發佈:2019-02-06
思路
純資料結構。
程式碼
#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;
}