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

来源:互联网 发布:怎样用js做用户名验证 编辑:程序博客网 时间:2024/06/03 22:55

题目描述

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

输入

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

输出

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

示例输入

AAAAABCDTHE_CAT_IN_THE_HAT

示例输出

64 13 4.9

144 51 2.8

#include <stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>using namespace std;char Tree[500];//字符串int num[500];//统计字符个数/*bool cmp(int x,int y)//将字符串个数s升序排序{   return x<y;}

*/int main(){    while(~scanf("%s",Tree))    {        int l;        l=strlen(Tree);        int sum=0,sum1=0;//哈弗曼码数 //ASCLL编码数量        sum1=l*8;        int queue[100];//用一个队列来保存数组中相加的数        int k=0,count=0;        memset(num,0,sizeof(num));//将计数的数组初始化全部为0;        for(int i=0;i<l;i++)//统计字符个数            num[Tree[i]]++;        for(int i=0;i<500;i++)//将字符个数保存起来            if(num[i]!=0)             queue[k++]=num[i];        while(k-count>=2) //注意边界循环条件最小生成树的条件;        {            sort(queue+count,queue+k);//排序的范围将字符个数升序排列;            int a=queue[count];            count++;            int b=queue[count];            count++;            queue[k++]=a+b;            sum+=a+b;        }        printf("%d %d %.1lf\n",sum1,sum,(sum1*1.0)/(sum*1.0));//输出时强制类型转换    }    return 0;}

#include<iostream>#include<queue>#include<cstdio>#include<cstring>using namespace std;int main(){    int num[500];    char s1[500];     while(~scanf("%s",s1))      {          priority_queue<int,vector<int>,greater<int> >q;          int l=strlen(s1);          int sum=0,sum1=l*8;           memset(num,0,sizeof(num));           for(int i=0;i<l;i++)            num[s1[i]]++;            for(int i=0;i<500;i++)                if(num[i])                 q.push(num[i]);            while(q.size()>=2)            {                  int a=q.top();                    q.pop();                  int b=q.top();                  q.pop();                  q.push(a+b);                  sum+=a+b;            }            printf("%d %d %.1lf\n",sum1,sum,sum1*1.0/sum);      }}

0 0
原创粉丝点击