TOJ 1225 数据结构练习题——Huffman Coding

来源:互联网 发布:jsp网上商城源码 编辑:程序博客网 时间:2024/05/18 09:03

数据结构练习题——Huffman Coding

时间限制(普通/Java):1000MS/10000MS     运行内存限制:65536KByte

描述

以前,没有电话的时候,进行快速远距离通信的主要手段是电报,即将所需要传送的文字转化成由二进制的字符组成的字符串。例如,假设需传送的电文为‘A B A C C D A’,它只有四种字符,根据字符出现的概率赋予每个字符一个权值(即字符在电文中出现的个数),比如:
A:3
B:1
C:2
D:1

此时我们有一种编码叫做Huffman编码可以对上述电文进行压缩(没有这个技术,人家可要多少你好多Money了!),现在要你完成Huffman编码,求出最后的平均码长。

输入

输入数据有多组,第一行输入测试数据组数m。接下来的m行中,每行一个n值开头,代表电文中有多少种不同的字符,后面输入n个正整数,表示每个字符的权值。假设字符种数不超过100个(英文不够可以用中文嘛^_^)。

输出

输出每组电文经过Huffman编码之后的平均码长,结果保留小数点后3位。

样例输入

22 1 14 3 1 2 1

样例输出

1.0002.250

 

#include <stdio.h>#include <queue>using namespace std;struct node{int x,y;friend bool operator <(node a,node b){if(a.x!=b.x)return a.x>b.x;return a.y>b.y;}};main(){node x,y;int t,n,sum,k,m;scanf("%d",&t);while(t--){sum = 0;priority_queue <node > q;scanf("%d",&n);m = n;while(m--){scanf("%d",&x.x);x.y = 1;q.push(x);}while(q.size()!=1){x = q.top();q.pop();y = q.top();q.pop();k = x.y+y.y;x.x =  x.x+y.x;x.y = k;sum += k;q.push(x);}printf("%.3lf\n",double(sum)/double(n));}}


#include<stdio.h>#define inf 0x7ffff;struct node{int w,parent,lchild,rchild;}tree[202];struct code{int start;int d[10];}huff[202];int n;void creat(){int i,j,m,w1,w2,w,x,y;m=2*n-1;for(i=1;i<=m;i++){tree[i].parent=tree[i].lchild=tree[i].rchild=0;}for(i=n+1;i<=m;i++){w1=w2=inf;x=y=0;for(j=1;j<i;j++){if(!tree[j].parent){if(w1>tree[j].w){w2=w1;y=x;w1=tree[j].w;x=j;}else if(w2>tree[j].w){y=j;w2=tree[j].w;}}}tree[i].w=w1+w2;tree[x].parent=tree[y].parent=i;tree[i].lchild=x;tree[i].rchild=y;}}void creat_huff(){int i,c,f;for(i=1;i<=n;i++){huff[i].start=n;for(c=i,f=tree[i].parent;f;c=f,f=tree[f].parent){if(c==tree[f].lchild)huff[i].d[huff[i].start--]=0;elsehuff[i].d[huff[i].start--]=1;}}}main(){int t,x,i;scanf("%d",&t);while(t--){scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&tree[i].w);creat();creat_huff();double sum=0.0;for(i=1;i<=n;i++)sum+=n-huff[i].start;sum/=n;printf("%.3f\n",sum);}}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机淘宝商家老打骚扰电话怎么办 手机上查询详单忘记服务密码怎么办 淘宝上的东西买过就找不到了怎么办 刚刚开的淘宝企业店没有流量怎么办 有图片怎么在淘宝找不到商品怎么办 白色高跟鞋鞋面磨脏了怎么办弄干净 我跟鞋后跟磨烂的脚怎么办? 内衣买回来有一股刺鼻的味道怎么办 裁剪袖子开口偏了1公分怎么办 对于这乱扔垃圾不听劝者该怎么办 感觉被南通蒲公英店铺骗了怎么办 6个月宝宝吃米粉不吃奶怎么办 十个月的宝宝不吃辅食怎么办 5个月宝宝拉肚子有泡沫怎么办 生完孩子后皮肤暗黄怎么办 开服装店批发服装的吊牌怎么办 天虹的鞋一天就坏了怎么办 车被钥匙划了露底漆了怎么办 数控铣z轴回不了参考点怎么办 白色衣服被黑色衣服染了怎么办 夏天出汗衣服粘身上都是毛毛怎么办 支付宝租的手机坏了怎么办 新买的衣服布料扎人怎么办 洗衣服的时候卫生纸沾裤子上怎么办 洗衣服给白衣服染上色了怎么办 不小心喝了游泳池的水怎么办 铁水中硅的含量高了怎么办 视频拍摄单人变双人是怎么办的 四季青进来的货比淘宝还贵怎么办 淘宝还没收货价格买贵了怎么办 在微信上赌博庄跑了怎么办 微信赌博输了10000多怎么办 欠了信用卡说来来家里调查怎么办 没用过的超市购物卡丢了怎么办 体验服抢号成功手机号填错了怎么办 起亚kx3一键启动钥匙没电怎么办 逆战下载的时候显示文件损坏怎么办 移动公司买手机送话费套路怎么办 开通京东白条身份信息被占用怎么办 丰巢快递柜把东西寄丢了怎么办? 圆通快递把我寄的东西弄丢了怎么办