数据结构练习题——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位。

样例输入

2
2 1 1
4 3 1 2 1

样例输出

1.000
2.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);}
}

TOJ 1225 数据结构练习题——Huffman Coding相关推荐

  1. Huffman Coding 哈夫曼树

    一.实验名称:Huffman Coding 二.实验目的: 熟练掌握哈夫曼树的数据结构,结构的特点: 能够实现哈夫曼树的基本操作:如构造,插入等 利用最小堆降低哈夫曼树的时间复杂度. 熟练掌握最小堆的 ...

  2. 赫夫曼编码-译码器(Huffman Coding)

    基本概念 哈夫曼编码(Huffman Coding):又称霍夫曼编码.赫夫曼编码-,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据 ...

  3. JAVA——赫夫曼编码-译码器(Huffman Coding)

    基本概念 哈夫曼编码(Huffman Coding):又称霍夫曼编码.赫夫曼编码-,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据 ...

  4. C++——赫夫曼编码-译码器(Huffman Coding)

    基本概念 哈夫曼编码(Huffman Coding):又称霍夫曼编码.赫夫曼编码-,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据 ...

  5. 哈夫曼编码(Huffman Coding)

    霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...

  6. 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块

    [题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...

  7. 数据结构练习题――Hero In Maze 简单版

    数据结构练习题――Hero In Maze 简单版 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte 总提交:306            ...

  8. 数据结构练习题---先序遍历二叉树

    数据结构练习题---先序遍历二叉树 时间限制(普通/Java):3000MS/10000MS          运行内存限制:65536KByte 总提交:107            测试通过:64 ...

  9. [Python]常用数据结构 练习题

    常用数据结构 练习题 输人5个整数放到列表list1 中,输出下标及值,然后将列表listl 中大于平均值的元素组成一个新列表list2,输出平均值和列表list2.请利用列表推导式解决该问题. li ...

最新文章

  1. 两分公支的IPSec***流量走总部测试
  2. 程序员被辞 12 天,前领导要求回公司解释代码,结果懵了…
  3. Spring Boot实现一个天气预报系统(二)数据同步
  4. 基于界面的银行家算法java实现_java实现银行家算法(Swing界面)
  5. STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值
  6. 网络编程-TCP/IP协议栈-UDP/HTTP协议
  7. 实战 | 手把手教你设计优惠券前后台
  8. noip2017初赛的一些知识点
  9. 【我的物联网成长记1】如何进行端到端开发?
  10. struts2.0+spring intercepter 不能注入属性
  11. Linux虚拟机-配置文件说明
  12. React-Native学习指南 1
  13. BottomBar之Android底部菜单
  14. 使用V-ASSISTANT软件配置V90伺服驱动器参数的具体步骤详解
  15. Android GMS重要工具和资料下载
  16. python--模拟掷骰子游戏
  17. Android 项目实战视频资料 学习充电必备
  18. Permission denied: user=10273, access=WRITE, inode=“/cou/jd_phone_list“:root:supergroup:-rw-r--r--
  19. 华为服务器休眠远程怎么唤醒,华为路由WS5200怎么设置远程唤醒功能
  20. 2016-2017-1 《信息安全系统设计基础》课程总结

热门文章

  1. android计步器进度条,Android实现计步进度的环形Progress
  2. 结构方程模型如何分析?
  3. linux系统FW升降级步骤,[Fw]初探linux中断系统(2)
  4. ABG(应用负载网关)——终端共享接入检测方案、智能链路负载均衡(LLB)
  5. 绵阳计算机维修价格,绵阳维修电脑
  6. 迈拓网络硬盘软件全攻略(5)mldonkey
  7. linux pyautogui 安装_PyAutoGUI——让所有GUI都自动化
  8. php+mysql在线考试系统源码_phpmysql在线考试系统-PHP源码
  9. stm32f4 adc 使用
  10. 指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL