您的位置:首页 > 运维架构

HDU1053 - Entropy (哈夫曼树)

2015-09-07 21:55 344 查看
题目链接

思路

代码

思路

纯数据结构。

代码

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: