哈夫曼编码,
利用STL中的优先队列使得代码较为简单,
代码如下:
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
#define M 256
struct node{
int w;
bool operator < (const node &a)const{
return w>a.w;
}
};
node temp;
int ans, c[M];
priority_queue<node>q;
int main ()
{
char str[500];
while(scanf("%s", str))
{
if(!strcmp(str,"END")) break;
int len = strlen(str);
for(int i = 0; i < len; i++)
c[str[i]]++;
for(int i = 0; i < M; i++) if(c[i])
{
temp.w = c[i];
q.push(temp);
c[i] = 0;
}
ans = 0;
while(q.size()>1)
{
int a = q.top().w; q.pop();
int b = q.top().w; q.pop();
temp.w = a+b;
ans+=temp.w;
q.push(temp);
}
if(ans==0) ans = len;//特判字符串的长度为1的情况
printf("%d %d %.1lf\n",8*len, ans, 8.0*len/ans);
while(!q.empty()) q.pop();
}
return 0;
}