| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
哈夫曼模板,0MS水过/*
题意:给你一个字符串,首先是计算出一个按正常编码的编码长度,
其次是计算出一个用霍夫曼编码的编码长度,最后求正常编码的长度除以霍夫曼编码长度的值,保留一位小数。
*/
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN=250;
struct node
{
int weight;//权值
int lchild;//左孩子
int rchild;//右孩子
int parent;//父亲
}hufftree[MAXN];
int w[MAXN];
bool vis[MAXN];
//这个函数自我感觉比网上好,容易理解
int WPL(int rt,int tep)//rt为根,tep为深度
{
if(hufftree[rt].lchild==-1&&hufftree[rt].rchild==-1)
{
return hufftree[rt].weight*tep;
}
else
{
return WPL(hufftree[rt].lchild,tep+1)+WPL(hufftree[rt].rchild,tep+1);
}
}
void select(int &s1,int &s2,int n)
{
int i;
s1=s2=0;
for(i=1;i<=n;i++) //随便给s1,s2赋一个初值
{
if(hufftree[i].parent==-1)
{
if(s1==0)
{
s1=i;
}
else
{
s2=i;
break;
}
}
}
if(hufftree[s1].weight>hufftree[s2].weight)
{
swap(s1,s2);
}
for(i=i+1;i<=n;i++)//i点就是s2或者s1中的其中一个,所以要跳过
{
if(hufftree[i].parent==-1)
{
if(hufftree[s1].weight>hufftree[i].weight)
{
s2=s1;
s1=i;
}
else
{
if(hufftree[s2].weight>hufftree[i].weight)
{
s2=i;
}
}
}
}
}
void Build_Tree(int n)//n个节点
{
for(int i=1;i<=2*n-1;i++)//第一步,初始化为-1
{
hufftree[i].lchild=-1;
hufftree[i].rchild=-1;
hufftree[i].parent=-1;
}
for(int i=1;i<=n;i++) //第二步,存放权值
{
hufftree[i].weight=w[i];
}
int num=n;//现在有n个节点赋值了
for(int i=n+1;i<=2*n-1;i++)
{
int i1,i2;
select(i1,i2,num);//第三步,找两个最小值
num++;//找到一个加一
hufftree[i].weight=hufftree[i1].weight+hufftree[i2].weight;
hufftree[i].lchild=i1;
hufftree[i].rchild=i2;
hufftree[i1].parent=i;
hufftree[i2].parent=i;
}
}
int main()
{
string s;
while(1)
{
cin>>s;
if(s=="END")break;
memset(w,0,sizeof(w));
memset(vis,false,sizeof(vis));
int len=s.length();
int k=1;
for(int i=0;i<len;i++)
{
int cnt=0;
for(int j=0;j<len;j++)
{
if(!vis[s[j]])
{
if(s[i]==s[j])
cnt++;
}
}
if(cnt!=0)
{
w[k++]=cnt;
vis[s[i]]=true;
}
}
k--;
if(k==1)
{
printf("%d %d 8.0\n",8*len,len);
}
else
{
Build_Tree(k);
/*int i=2*k-1;//这里是找根,不过没必要,因为根就是2*k-1
for(i=1;i<=2*k-1;i++)
{
if(hufftree[i].parent==-1)break;
}*/
int lenWPL=WPL(2*k-1,0);
printf("%d %d %.1lf\n",len*8,lenWPL,len*8.0/lenWPL);
}
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator