Haffman编码

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去。。。)。现在给你一串字符以及它们所对应的权值,让你构造哈弗曼树,从而确定每个字符的哈弗曼编码。当然,这里有一些小规定:

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编码相关推荐

  1. Haffman编码实现文本压缩-C语言-万字长文,绝对详细

    目录 前言 一.实验目的 二.实验要求 三.设计思想 1 编码 1.1 生成Haffman编码 (1)统计字符频率 (2)构造Haffman树 1.2 文本编码 2 译码 2.1 读入译码信息 2.2 ...

  2. Haffman编码(算法导论)

    上次算法导论课讲到了Haffman树,笔者惊叹于Haffman编码的压缩效果,故想自己亲自动手尝试写一个极简的Haffman压缩程序. 首先,我们来了解一下什么是Haffman编码 Haffman编码 ...

  3. 数据结构实验三:Huffman树及Huffman编码的算法实现

    Exp03 Huffman树及Huffman编码的算法实现 Author: Maskros 实验目的 了解该树的应用实例,熟悉掌握Huffman树的构造方法及Huffman编码的应用, 了解Huffm ...

  4. c++实验8 哈夫曼编码-译码器

    哈夫曼编码-译码器 此次实验的注释解析多加不少---若对小伙伴们有帮助 希望各位麻烦点个关注 多谢 1.哈夫曼树构造算法为: (1)由给定的n个权值{w1,w2,-,wn}构造n棵只有根结点的二叉树, ...

  5. 泰文utf-8转unicode编码实现

    前言:最近的有个项目是要读取泰文然后将泰文叠加到图片上.查了一周的资料,所有的流程已经走通了. 一.实现原理 想要将泰文叠加到图片上需要两个步骤: 泰文转成unicode编码: 泰文实际上是utf-8 ...

  6. UNICODE、GB18030、ASCII编码

    1.GB18030 编码 GB18030编码采用单字节.双字节.四字节分段编码方案,具体码位见下文.GB18030向下兼容GBK和GB2312编码. 国家标准GB18030-2005<信息技术 ...

  7. 算术编码原理及其python实现

    目录 1. 原理部分: 2. 香农界理论分析: 3. 代码实现: 4.实验结果 1. 原理部分: 原理部分参考什么是算术编码 一个从信源序列到不可压缩二元序列的一个可逆映射,假设序列{X1-Xn}\{ ...

  8. 哈夫曼编码算法 c语言,《哈夫曼编码的算法》

    以前的作业,拿出来看看,都不会了.郁闷 记得当时为了完成这作业,求了一圈朋友,最后还是在图书馆网络中找的!呵呵!在这里晒晒了 设计报告内容: 一. 课程设计名称 <哈夫曼编码的算法> 二. ...

  9. Unicode字符编码规范

    http://www.aoxiang.org 2006-4-2 10:48:02 Unicode是一种字符编码规范 . 先从ASCII说起.ASCII是用来表示英文字符的一种编码规范,每个ASCII字 ...

最新文章

  1. MySQL数据库将查询结果插入到其它表中
  2. python init文件作用___init__.py 文件的作用
  3. 手机mvno怎么设置_微信透明背景壁纸怎么弄 手机设置方法教程分享
  4. 用平方映射理解tanh
  5. 两个不同网段的局域网如何互通_不同网段之间如何通信?
  6. 开源 数据仓库_使用这些开源工具进行数据仓库
  7. 前沿 | VLDB 2019论文解读:阿里巴巴大规模数据库智能参数优化的创新与实践
  8. 上传图片并显示缩略图的最简单方法(c#)
  9. 拓端tecdat|R语言数据的收益率和可能的波动性交易
  10. 最大子段和三种算法实现
  11. 数据挖掘、数据分析以及大数据之间的区别有哪些?
  12. 微创新:粉丝电子商务及微博的9种盈利模式
  13. STM32F7以太网HAL库源文件(stm32f7xx_hal_eth.c)笔记
  14. 【调剂】2020燕山大学电气工程学院“智能信息处理”课题组研究生招生及调剂信息发布了!...
  15. 8寸7寸触摸屏常见的故障问题和维修方法分别是什么?
  16. linux cadaver 命令,(个人学习Linux经历)文本命令
  17. 分治策略时间复杂度计算
  18. 正弦波产生电路_文氏桥振荡
  19. vue页面中el-carousel轮播页面或图片
  20. 16、Python小案例

热门文章

  1. 获取用户精准地理位置信息(百度地图)
  2. java使用jdbc调用hive出现The query did not generate a result set!
  3. CentOS上安装skype
  4. Java Web 分页实现
  5. Spark使用总结与分享
  6. 基础网络和关键基础设施
  7. 布点算法的原理和实现
  8. python 没有了matlab的fscanf功能,我该怎么办
  9. ios平台下的DES加密
  10. [ZZ]如何在Web页面上直接打开、编辑、创建Office文档