NYOJ 801 Haffman编码
Haffman编码
- 描述
-
哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去。。。)。现在给你一串字符以及它们所对应的权值,让你构造哈弗曼树,从而确定每个字符的哈弗曼编码。当然,这里有一些小规定:
1.规定哈弗曼树的左子树编码为0,右子树编码为1;
2.若两个字符权值相同,则ASCII码值小的字符为左孩子,大的为右孩子;
3.创建的新节点所代表的字符与它的左孩子的字符相同;
4.所有字符为ASCII码表上32-96之间的字符(即“ ”到“`”之间的字符)。
- 输入
-
输入包含多组数据(不超过100组)
每组数据第一行一个整数n,表示字符个数。接下来n行,每行有一个字符ch和一个整数weight,表示字符ch所对应的权值,中间用空格隔开。
输入数据保证每组测试数据的字符不会重复。 - 输出
- 对于每组测试数据,按照输入顺序输出相应的字符以及它们的哈弗曼编码结果,具体格式见样例。
- 样例输入
-
3 a 10 b 5 c 8 4 a 1 b 1 c 1 d 1
- 样例输出
-
a:0 b:10 c:11 a:00 b:01 c:10 d:11
-
AC码:
-
#include<stdio.h> #include<string.h> #include<stdlib.h> #define INF 99999999 struct node {char ch;char *str; // 用于存储Huffman编码int weight;int parent;int LChild;int RChild; }num[200]; int main() {int n,min1,min2,s1,s2,i,j,m;int start,c,p;char *cd; // 临时存储Huffman编码while(~scanf("%d",&n)){for(i=1;i<=n;i++){getchar();scanf("%c%d",&num[i].ch,&num[i].weight);num[i].parent=0;num[i].LChild=0;num[i].RChild=0;}m=2*n;for(i=n+1;i<m;i++){num[i].weight=0;num[i].parent=0;num[i].LChild=0;num[i].RChild=0;}// 构造Huffman树for(i=n+1;i<m;i++){min1=min2=INF;s1=s2=0;for(j=1;j<=i-1;j++){if(num[j].parent!=0)continue;if(min1>num[j].weight){min2=min1;min1=num[j].weight;s2=s1;s1=j;}else if(min1==num[j].weight&&num[s1].ch>num[j].ch){min2=min1;min1=num[j].weight;s2=s1;s1=j;}else if(min2>num[j].weight){min2=num[j].weight;s2=j;}else if(min2==num[j].weight&&num[s2].ch>num[j].ch){min2=num[j].weight;s2=j;}}num[i].weight=num[s1].weight+num[s2].weight;num[s1].parent=i;num[s2].parent=i;if(num[s1].weight==num[s2].weight){if(num[s1].ch>num[s2].ch){num[i].ch=num[s2].ch;num[i].LChild=s2;num[i].RChild=s1;}if(num[s1].ch<num[s2].ch){num[i].ch=num[s1].ch;num[i].LChild=s1;num[i].RChild=s2;}}else{num[i].ch=num[s1].ch;num[i].LChild=s1;num[i].RChild=s2;}}// Huffman树构造完毕// 求Huffman编码cd=(char *)malloc(n*sizeof(char));cd[n-1]='\0';for(i=1;i<=n;i++){start=n-1;c=i;p=num[i].parent;while(p!=0){--start;if(num[p].LChild==c)cd[start]='0';elsecd[start]='1';c=p;p=num[p].parent;}num[i].str=(char *)malloc((n-start)*sizeof(char));strcpy(num[i].str,&cd[start]);}free(cd);for(i=1;i<=n;i++)printf("%c:%s\n",num[i].ch,num[i].str);}return 0; }
NYOJ 801 Haffman编码相关推荐
- Haffman编码实现文本压缩-C语言-万字长文,绝对详细
目录 前言 一.实验目的 二.实验要求 三.设计思想 1 编码 1.1 生成Haffman编码 (1)统计字符频率 (2)构造Haffman树 1.2 文本编码 2 译码 2.1 读入译码信息 2.2 ...
- Haffman编码(算法导论)
上次算法导论课讲到了Haffman树,笔者惊叹于Haffman编码的压缩效果,故想自己亲自动手尝试写一个极简的Haffman压缩程序. 首先,我们来了解一下什么是Haffman编码 Haffman编码 ...
- 数据结构实验三:Huffman树及Huffman编码的算法实现
Exp03 Huffman树及Huffman编码的算法实现 Author: Maskros 实验目的 了解该树的应用实例,熟悉掌握Huffman树的构造方法及Huffman编码的应用, 了解Huffm ...
- c++实验8 哈夫曼编码-译码器
哈夫曼编码-译码器 此次实验的注释解析多加不少---若对小伙伴们有帮助 希望各位麻烦点个关注 多谢 1.哈夫曼树构造算法为: (1)由给定的n个权值{w1,w2,-,wn}构造n棵只有根结点的二叉树, ...
- 泰文utf-8转unicode编码实现
前言:最近的有个项目是要读取泰文然后将泰文叠加到图片上.查了一周的资料,所有的流程已经走通了. 一.实现原理 想要将泰文叠加到图片上需要两个步骤: 泰文转成unicode编码: 泰文实际上是utf-8 ...
- UNICODE、GB18030、ASCII编码
1.GB18030 编码 GB18030编码采用单字节.双字节.四字节分段编码方案,具体码位见下文.GB18030向下兼容GBK和GB2312编码. 国家标准GB18030-2005<信息技术 ...
- 算术编码原理及其python实现
目录 1. 原理部分: 2. 香农界理论分析: 3. 代码实现: 4.实验结果 1. 原理部分: 原理部分参考什么是算术编码 一个从信源序列到不可压缩二元序列的一个可逆映射,假设序列{X1-Xn}\{ ...
- 哈夫曼编码算法 c语言,《哈夫曼编码的算法》
以前的作业,拿出来看看,都不会了.郁闷 记得当时为了完成这作业,求了一圈朋友,最后还是在图书馆网络中找的!呵呵!在这里晒晒了 设计报告内容: 一. 课程设计名称 <哈夫曼编码的算法> 二. ...
- Unicode字符编码规范
http://www.aoxiang.org 2006-4-2 10:48:02 Unicode是一种字符编码规范 . 先从ASCII说起.ASCII是用来表示英文字符的一种编码规范,每个ASCII字 ...
最新文章
- MySQL数据库将查询结果插入到其它表中
- python init文件作用___init__.py 文件的作用
- 手机mvno怎么设置_微信透明背景壁纸怎么弄 手机设置方法教程分享
- 用平方映射理解tanh
- 两个不同网段的局域网如何互通_不同网段之间如何通信?
- 开源 数据仓库_使用这些开源工具进行数据仓库
- 前沿 | VLDB 2019论文解读:阿里巴巴大规模数据库智能参数优化的创新与实践
- 上传图片并显示缩略图的最简单方法(c#)
- 拓端tecdat|R语言数据的收益率和可能的波动性交易
- 最大子段和三种算法实现
- 数据挖掘、数据分析以及大数据之间的区别有哪些?
- 微创新:粉丝电子商务及微博的9种盈利模式
- STM32F7以太网HAL库源文件(stm32f7xx_hal_eth.c)笔记
- 【调剂】2020燕山大学电气工程学院“智能信息处理”课题组研究生招生及调剂信息发布了!...
- 8寸7寸触摸屏常见的故障问题和维修方法分别是什么?
- linux cadaver 命令,(个人学习Linux经历)文本命令
- 分治策略时间复杂度计算
- 正弦波产生电路_文氏桥振荡
- vue页面中el-carousel轮播页面或图片
- 16、Python小案例