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

ACM--Entrophy(哈希+数组 建树)

2015-07-15 18:09 543 查看
//采用哈希的思想建哈夫曼树
//0-9对应的数组地址1-10   A-Z对应的数组11-36  '_'则是37
//新生成的N-1课树从38开始建立

#include<iostream>
#include<string.h>
#include<iomanip>
using namespace std;
int T[100][5];
void select(int &min,int &max)
{
int Min_val=9999999;
int Min_i;
for(int i=min;i<=max;i++)
if(T[i][0]<Min_val&&T[i][1]==0)//选择没父亲的树
{
Min_val=T[i][0];
Min_i=i;
}
int Max_i;
int Max_val=9999999;
for(int i=min;i<=max;i++)
{
if(i==Min_i)
continue;
if(T[i][0]<Max_val&&T[i][1]==0)
{
Max_val=T[i][0];
Max_i=i;
}
}
min=Min_i;
max=Max_i;
}
int main()
{
string n;
while(getline(cin,n),n!="END")
{
int lenth=n.size();
for(int i=1;i<100;i++)
{
T[i][1]=-1;T[i][0]=0;//所有结点的权重初始为0,父亲为-1
}
for(int i=0;i<lenth;i++)
{
if(n[i]>='A'&&n[i]<='Z')
{
T[n[i]-54][0]++; T[n[i]-54][1]=0;
}
if(n[i]>='0'&&n[i]<='9')
{
T[n[i]-47][0]++;T[n[i]-47][1]=0;
}
if(n[i]=='_')
{
T[n[i]-58][0]++; T[n[i]-58][1]=0;
}
}
int sum=0;
for(int i=1;i<100;i++)
if(T[i][0])
sum++;
int flag=0;
if(sum==1)
flag=1;
int max=37;
int j=max;
int min=1;
while(j<=37+sum-2)
{
select(min,max);
T[j+1][0]=T[min][0]+T[max][0];//新的树的权重等于两个孩子的权重和
T[j+1][2]=min;T[j+1][3]=max;//新的树的左右孩子的地址
T[j+1][1]=0;//新的树的父亲为0
T[min][1]=j+1;T[max][1]=j+1; //左右子树的父亲为 j+1
j++;
max=j;
min=1;
}
for(int i=1;i<=37;i++)
{
if(T[i][1]!=-1)
{
int j=i;
int temp=0;
while(T[j][1])
{
temp++;
j=T[j][1];

}
T[i][4]=temp;
}
}
sum=0;
for(int i=0;i<lenth;i++)
{
if(n[i]>='A'&&n[i]<='Z')
{
sum+=T[n[i]-54][4];
}
if(n[i]>='0'&&n[i]<='9')
{
sum+=T[n[i]-47][4];
}
if(n[i]=='_')
{
sum+=T[n[i]-58][4];
}
}
if(flag)
sum=lenth;
cout<<lenth*8<<" "<<sum<<" ";
cout<<fixed<<setprecision(1)<<(float)lenth*8/(float)sum<<endl;
}

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