PkU ACM 1521(哈夫曼编码)

虽然对huffman树的算法思想已经了解,但是却不能将之熟练的变成代码程序,希望通过此次训练使自己对huffman的编程思想更加的了解!

(下面的程序为请教同学而得到!)

#include<iostream> 
#include<cstring> 
using namespace std;
struct T{
	int weight; //权值 
	int parent,lchild,rchild;
}node[60];
int main()
{
	char ch[100000];
	int hash[35];
	int i,j,k,len;
	while(cin>>ch,strcmp(ch,"END")!=0)
	{
		memset(hash,0,sizeof(hash));
		len=strlen(ch);
		for(i=0;i<len;i++)
		{
			hash[ch[i]-64]++;    //ch数组为大写字母串 
		}
		for(i=1,j=1;i<35;i++)
		{
			if(hash[i]!=0)
			{
				node[i].weight=hash[i];
				node[j].parent=node[j].lchild=node[j].rchild=0;
				j++;
			}
		}
		j--;
	    for(i=j+1;i<j*2;i++)
	    node[i].parent=node[i].lchild=node[i].rchild=0;
	    for(i=j+1;i<j*2;i++)
	    {
	    	int m1,m2;
	    	m1=m2=999999;    //!!老是忘记对定义初始值
	    	int x1,x2;
	    	for(k=1;k<i;k++)
	    	{
	    		if(node[k].weight<m1&&node[k].parent==0)
	    		{
	    			m2=m1;
	    			x2=x1;
	    			m1=node[k].weight;
	    			x1=k;
	    		}
	    		else
	    		  if(node[k].weight<m2&&node[k].parent==0)
	    		  {
	    		  	m2=node[k].weight;
	    		  	x2=k;
	    		  }
	    	}
	    	node[i].weight=m1+m2;
	    	node[i].rchild=x1;
	    	node[i].lchild=x2;
	    	node[x1].parent=i;
	    	node[x2].parent=i;
	    }
	    int sum=0;
	    int cnt;
	    for(i=1;i<j+1;i++)
	    {
	    	k=i;
	    	cnt=0;
	    	while(node[k].parent!=0)
	    	{
	    		k=node[k].parent;
	    		cnt++;
	    	}
	    	sum+=cnt*node[i].weight;
	    }
	    if(j==1)
	    sum=len;
	    float ratio;
	    ratio=float(len*8)/sum;
	    printf("%d %d %.1f\n",len*8,sum,ratio); 
	} 
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值