SDUT-数据结构实验之二叉树六:哈夫曼编码

来源:互联网 发布:淘宝假货退款不退货 编辑:程序博客网 时间:2024/06/01 10:26

数据结构实验之二叉树六:哈夫曼编码

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss

Problem Description

字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码。该方法完全依据字符出现概率来构造出平均长度最短的编码,称之为最优编码。哈夫曼编码常被用于数据文件压缩中,其压缩率通常在20%90%之间。你的任务是对从键盘输入的一个字符串求出它的ASCII编码长度和哈夫曼编码长度的比值。

Input

 输入数据有多组,每组数据一行,表示要编码的字符串。

Output

 对应字符的ASCII编码长度lahuffman编码长度lhla/lh的值(保留一位小数),数据之间以空格间隔。

Example Input

AAAAABCDTHE_CAT_IN_THE_HAT

Example Output

64 13 4.9144 51 2.8

Hint

 

Author

 xam

#include <bits/stdc++.h>using namespace std;int main(){    char s[10000];    while(scanf("%s",s)!=EOF)    {        priority_queue<int,vector<int>,greater<int> >q;        int len,i,m,x,y;        m=0;        int a[1000]={0};        len=strlen(s);        for(i=0; i<len; i++)        {            a[s[i]]++;            if(s[i]>m)            {                m=s[i];            }        }        for(i=0; i<=m; i++)        {            if(a[i]!=0)                q.push(a[i]);        }        int sum=0;        while(!q.empty())        {            x=q.top();            q.pop();            if(!q.empty())            {                y=q.top();                q.pop();                sum+=(x+y);                q.push(x+y);            }        }        cout<<len*8<<' '<<sum<<' '<<setprecision(2)<<len*8.0/sum<<endl;    }    return 0;}
//有大神知道为什么下面的过不了望指点
#include <bits/stdc++.h>using namespace std;int main(){    string s;    while(getline(cin,s))    {        priority_queue<int,vector<int>,greater<int> >q;        int len,i,m,x,y;        m=0;        int a[256]={0};        len=s.length();        for(i=0; i<len; i++)        {            a[s[i]]++;            if(s[i]>m)            {                m=s[i];            }        }        for(i=0; i<=m; i++)        {            if(a[i]!=0)                q.push(a[i]);        }        int sum=0;        while(!q.empty())        {            x=q.top();            q.pop();            if(!q.empty())            {                y=q.top();                q.pop();                sum+=(x+y);                q.push(x+y);            }        }        cout<<len*8<<' '<<sum<<' '<<setprecision(2)<<len*8.0/sum<<endl;    }    return 0;}
#include <bits/stdc++.h>using namespace std;void qsort(int a[],int left,int right){    int x=a[left],i=left,j=right;    if(i>=j)        return;    while(i<j)    {        while(i<j&&a[j]>=x)j--;        a[i]=a[j];        while(i<j&&a[i]<=x)i++;        a[j]=a[i];    }    a[i]=x;    qsort(a,left,i-1);    qsort(a,i+1,right);}int main(){    char s[1001];    int t[500],q[500];    while(cin>>s)    {        memset(t,0,sizeof(t));        int top=0;        int rear=0;        int len=strlen(s);        int sum1=len*8,sum2=0;        for(int i=0;i<len;i++)        {            t[s[i]]++;        }        for(int i=0;i<500;i++)        {            if(t[i]!=0)            q[top++]=t[i];        }        qsort(q,0,top-1);        while(rear!=top)        {            int x1=q[rear++];            if(rear!=top)            {                int x2=q[rear++];                sum2+=(x1+x2);                q[top++]=x1+x2;                qsort(q,rear,top-1);            }        }        printf("%d %d %.1lf\n",sum1,sum2,1.0*sum1/sum2);    }    return 0;}

 
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 8月宝宝不吃辅食怎么办 8个月不吃辅食怎么办 宝宝不吃药怎么办一岁 奶水不足宝宝又不吃奶粉怎么办 一岁婴儿突然不吃饭怎么办 一岁宝宝突然不吃饭怎么办 一岁半宝宝突然不爱吃饭怎么办 1岁宝宝突然不爱吃饭怎么办 一岁多宝宝突然不爱吃饭怎么办 一岁半宝宝突然不吃饭怎么办 八个月宝宝不吃奶粉怎么办 小孩铅超标怎么办如何排铅 宝宝突然不吃辅食怎么办 6个月宝宝不喝奶怎么办 宝宝4月不吃母乳怎么办 不吃母乳怎么办 8个月 宝宝不吃奶粉母乳又不够怎么办 宝宝只吃母乳不吃奶粉怎么办 十个月宝宝不爱吃辅食怎么办 奶水不足宝宝不吃奶粉怎么办 两个月宝宝不吃奶瓶怎么办 宝宝拉的有鼻涕怎么办 七个月宝宝拉肚子拉水怎么办 十个月宝宝拉肚子拉水怎么办 一个月宝宝拉肚子拉水怎么办 五个月的宝宝拉肚子还拉水怎么办 4岁宝宝拉肚子怎么办拉水样 刚出生的婴儿呕奶怎么办 8岁儿童腹泻呕吐怎么办 一岁宝宝呕吐腹泻怎么办 5岁儿童腹泻呕吐怎么办 4岁宝宝呕吐腹泻怎么办 7岁儿童腹泻呕吐怎么办 一个月婴儿呕奶怎么办 一个月婴儿呕奶严重怎么办 6岁宝宝大便干燥怎么办 3岁儿童干咳嗽怎么办 3岁宝宝一直咳嗽怎么办 3岁宝宝风寒咳嗽怎么办 刚出生的宝宝拉奶瓣怎么办 小孩拉痢疾带血怎么办