| ||||||||||
| 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 | |||||||||
Re:哈夫曼模板,0MS水过In Reply To:哈夫曼模板,0MS水过 Posted by:LXY5201314 at 2018-10-30 17:10:43 > /*
> 题意:给你一个字符串,首先是计算出一个按正常编码的编码长度,
> 其次是计算出一个用霍夫曼编码的编码长度,最后求正常编码的长度除以霍夫曼编码长度的值,保留一位小数。
> */
> #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