69,374
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int WQD=0x3f3f3f3f;
typedef struct
{
int data;
int fu;
}jgt;
jgt d[100];//建立100个结点
void Huffman(int n)
{
int m1,m2,x1,x2,t,i,j;
for(i=0;i<n;i++)
{
m1=m2=WQD;
for(j=0;j<n+i;j++)//找到两个较小值的根结点
{
if(m1>d[j].data&&d[j].fu==-1&&d[j].data!=0)
{
m2=m1;
m1=d[j].data;
x2=x1;
x1=j;
}
else if(m2>d[j].data&&d[j].fu==-1&&d[j].data!=0)
{
x2=j;
m2=d[j].data;
}
}
if(m2!=WQD)
{
t=n+i;
d[t].data=m1+m2;//加入结点
d[x1].fu=t;
d[x2].fu=t;
}
}
}
int main()
{
clock_t start,finish; //测试运行时间
start=clock();
char s[2000];
int i,l,c,p,zjs;
while(scanf("%s",s))
{
if(strcmp(s,"END")==0)
break;
for(i=0;i<80;i++)//初始化
{
d[i].data=0;
d[i].fu=-1;
}
l=strlen(s);//记录字符串扯?
for(i=0;i<l;i++)
if(s[i]=='_')
d[26].data++;
else
d[s[i]-'A'].data++;
Huffman(27);//建立哈弗曼树
for(i=0;i<=26;i++)
{
c=0;
if(d[i].data!=0)
{
p=i;
while(d[p].fu!=-1)
{
c++;
p=d[p].fu;
}
if(c==0)
c=1;
d[i].data=c;
}
}
zjs=0;//zjs记录所需总字节数
for(i=0;i<l;i++)
{
if(s[i]=='_')
zjs+=d[26].data;
else
zjs+=d[s[i]-'A'].data;
}
printf("%d %d %.1f\n",8*l,zjs,8.0*l*1.0/zjs);
finish=clock();
printf("共耗时%.3lf秒",((double)finish-start)/1000);
}
return 0;
}