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; }
相关文章推荐
- Linux中shell学习笔记_1
- linux内存屏障浅析
- centos 下yum lock的解决办法
- 嵌入式linux之按键驱动程序
- 配置Tomcat虚拟目录和主机,通过主机名来访问项目
- Linux ls命令参数详解 <转>
- Linux 服务器安全技巧
- ubuntu15.04安装jdk1.8.0_45和tomcat8
- linux中时间设置date、hwclock、clock
- centos中mysql远程连接失败解决方案
- yum安装lamp分离教程
- 利用Maven把Web应用部署到tomcat中
- Linux下的passwd和shadow文件
- Linux 服务器安全技巧
- Magento使用php shell 命令更新索引(index)
- 查看linux发行版本
- Linux TOP命令各参数详解
- 每天进步一点点——linux——awk
- 【Linux系统】嵌入式系统中文环境设置
- svn 回滚到上一个版本shell 脚本