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

来源:互联网 发布:数控车椭圆编程实例 编辑:程序博客网 时间:2024/05/29 14:59
//采用哈希的思想建哈夫曼树 //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;}

0 0