| ||||||||||
| 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 | |||||||||
各位强人,帮忙看一下这个程序有啥问题啊?万分感谢,高山仰止!#include<iostream>
#include<string>
using namespace std;
//const int 28=27+1;//1...26(字母),27(_)
const int inf=10000;
struct node//某个字母
{
int time;//初始时他作为一个字母的出现次数
int len;//Huffman构造过程中他为根的子树叶子路径权值和
int w; //Huffman构造过程中他为根的子树叶子 权值和
};
node arr[28];
//用一个最小堆
struct heap
{
node *arr;
int heapsize;
heap(node *arr,int heapsize)
{
this->arr=arr;
this->heapsize=heapsize;
}
};
void heapify(heap &h,int pos)
{
int i=pos;
while(i<h.heapsize)
{
int sm=i;
if(i*2<=h.heapsize && h.arr[i*2].w<h.arr[sm].w) sm=i*2;
if(i*2+1<=h.heapsize && h.arr[i*2+1].w<h.arr[sm].w) sm=i*2+1;
if(sm!=i)
{
node temp=h.arr[i];
h.arr[i]=h.arr[sm];
h.arr[sm]=temp;
i=sm;
}
else
break;
}
}
void build(heap &h)
{
for(int i=h.heapsize/2;i>=1;i--)
{
heapify(h,i);
}
}
node extract(heap &h)
{
node temp=h.arr[1];
h.arr[1]=h.arr[h.heapsize];
h.arr[h.heapsize]=temp;
h.heapsize--;
heapify(h,1);//以w为比较依据
return temp;
}
void decrease(heap &h,int pos,int w)
{
//将h.arr[pos]的w域减少到int w,调整堆
int cur=pos;
int above=pos/2;
h.arr[cur].w=w;
while(above>=1)
{
if(h.arr[cur].w<h.arr[above].w)
{
node temp=h.arr[cur];
h.arr[cur]=h.arr[above];
h.arr[above]=temp;
cur=above;
above=cur/2;
}
else break;
}
}
void insert(heap &h,node z)
{
h.heapsize++;
h.arr[h.heapsize]=z;
int w=z.w;
z.w=inf;
decrease(h,h.heapsize,w);
}
void Huffman(int n,int asc_len) //[1...n]
{
heap h(arr,n);
build(h);
for(int i=1;i<=n-1;i++)
{
node x=extract(h);
node y=extract(h);
node z;
z.len=x.len+y.len+x.w+y.w;
z.w=x.w+y.w;
insert(h,z);
}
node final=extract(h);
cout<<final.len<<" ";
cout.setf(cout.showpoint);
cout.precision(1);
cout.setf(ios::fixed);
float res=(float)asc_len/(float)final.len;
cout<<res<<endl;
}
//已知字符串,求其哈弗曼编码的总长度
void fun(string str,int len,int asc_len)
{
int pos;
int dif[100];
int i;
for(i=1;i<=27;i++)
{
dif[i]=0;//不同字母或'_'的出现次数统计(可能有间隔)
}
for(i=0;i<len;i++)
{
if(str.at(i)=='_')
pos=27;
else //为字母
pos=str.at(i)%26+1;
dif[pos]++;
}
int j=1;
for(i=1;i<=27;i++)
{
if(dif[i]!=0)
{
arr[j].time=dif[i];
arr[j].len=0;
arr[j].w=arr[j].time;
j++;
}
}
j--;
Huffman(j,asc_len);
}
int main(void)
{
string str;
string end=string("END");
cin>>str;
while(str!=end)
{
int len=str.length();
cout<<8*len<<" ";
if(len==1) cout<<"1 "<<"8"<<endl;
else fun(str,len,8*len);
cin>>str;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator