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

POJ 1521 Entropy

2012-08-01 17:33 363 查看
求哈夫曼树的平均码长,用优先队列来写,先记录某个字符在字符串里出现的次数,然后放入

队列。依次取出第一小和第二小的数,将两个数相加,构成新的虚拟结点,放入队列中。

/*Accepted    196K    0MS    C++    918B    2012-08-01 17:25:00*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
using namespace std;

int key[1 << 7], len;
char t[1 << 10];

int huffman()
{
int i, a, b, c, sum = 0;
priority_queue<int, vector<int>, greater<int> > q;
for(i = 65; i < 100; i ++)
{
if(key[i] > 0)
q.push(key[i]);
}
while(q.size() > 1)
{
a = q.top(); q.pop();
b = q.top(); q.pop();
c = a + b;
sum += c;
q.push(c);
}
return sum > 0 ? sum : len; //当只有一个字符的时候
}

int main()
{
int i, sum;
while(scanf("%s", t) != EOF)
{
if(strcmp(t, "END") == 0) break;
len = strlen(t);
memset(key, 0, sizeof key);
for(i = 0; i < len; i ++)
key[t[i]] ++;
sum = huffman();
printf("%d %d %.1f\n", len * 8, sum, (double)len * 8 / sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: