Description

本题中,读入n个字符所对应的权值,生成赫夫曼编码,并依次输出计算出的每一个赫夫曼编码。

Input

输入的第一行包含一个正整数n,表示共有n个字符需要编码。其中n不超过100。
第二行中有n个用空格隔开的正整数,分别表示n个字符的权值。

Output

共n行,每行一个字符串,表示对应字符的赫夫曼编码。

Sample Input

8
5 29 7 8 14 23 3 11

Sample Output

0110
10
1110
1111
110
00
0111
010

HINT

赫夫曼树又名最优二叉树,它是一类带权路径长度最小的二叉树。通过构造赫夫曼树,我们可以得到赫夫曼编码,从而使得通信能够得到更高的效率。在本题中,构造赫夫曼树的过程使用了从叶子到根的逆向顺序,另外,还有一种从根出发直到叶子的赫夫曼编码构造算法

代码

/**************************************************************Problem: 2610User: 201717010009Language: CResult: AcceptedTime:0 msMemory:1096 kb
****************************************************************/
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct {int weight;int parent;int lchild;int rchild;
}HTNode,*HuffmanTree;
void Select(HTNode HT[],int n,int *s1,int *s2)
{int min1=10000,min2=10000;for(int i=1;i<=n;i++){if(HT[i].weight<min1&&HT[i].parent==0){min1=( HT[i].weight );*s1=i;}}HT[*s1].parent=1;//找到最小的  使父节点不为0 for(int i=1;i<=n;i++){if(HT[i].weight<min2&&HT[i].parent==0){min2=( HT[i].weight );*s2=i;}}HT[*s2].parent=1;//int j;if(*s1>*s2){j=*s1;*s1=*s2;*s2=j;}
}
void HuffmanCoding(int *w,int n)
{if(n<=1)return;int m=2*n-1;HTNode HT[m+1];HuffmanTree p;int i;for(p=&HT[1],i=1;i<=n;i++,p++,w++)//初始化1到n {p->weight=*w;p->lchild=0;p->rchild=0;p->parent=0;}for(;i<=m;i++,p++)//初始化n+1到m {p->lchild=0;p->parent=0;p->rchild=0;p->weight=0; }int s1=0,s2=0;for(i=n+1;i<=m;i++)//构建赫夫曼树 {Select(HT,i-1,&s1,&s2);//找到最小的两个权值的位置 HT[s1].parent=i;HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;HT[i].weight=HT[s1].weight+HT[s2].weight;}char HC[n+1][n];for(i=1;i<=n;i++){char cd[n];cd[n-1]='\0';int start=n-1,c,f;for(c=i, f=HT[i].parent; f!=0; c=f, f=HT[f].parent){if(HT[f].lchild==c){start--;cd[start]='0';}else{start--;cd[start]='1';}}strcpy(HC[i],&cd[start]);//从start处开始  直到最后  复制到 HC里 }for(int j=1;j<=n;j++){printf("%s",HC[j]);printf("\n");}
}int main()
{int n;scanf("%d",&n);int a[n];for(int i=0;i<n;i++){scanf("%d",&a[i]);}int *w=&a[0];HuffmanCoding(w,n);
}

哈夫曼编码(自底向上的哈夫曼编码)相关推荐

  1. 可逼近信道容量编码技术之霍夫曼编码的实现

    可逼近信道容量编码技术之霍夫曼编码的实现 简介 在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视.哈夫曼编码正是一种应用广泛且非常有效 ...

  2. 哈夫曼树--顺序结构(建立、编码、解码)

    引子: 这里的哈夫曼树的建立方法和上一篇不一样,是把数据放在数组上面的,而不是链表上面.因此,采用这种方法建立的哈夫曼树对节点的操作上比链式的哈夫曼树简单很多.对于空间问题,如果有m个item,那么需 ...

  3. 数据结构题:根据所给权值设计相应的哈夫曼树,并设计哈夫曼编码

    文章目录 前言 一.涉及到的知识点 二.例题讲解 1.例题1 2.例题2 总结 前言 在数据结构树的这章中,常常有题目,是这样的"给定一组权值-,试设计相应的哈夫曼树",有的还要求 ...

  4. c语言赫夫曼树的编码与译码,哈夫曼树与编码译码实现

    一.哈弗曼树的基本概念. 哈夫曼树,又称最优树,是一类带权路径长度最短的树.下面有几个概念: (1)路径. 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. (2)路径长度. 路径上的分枝 ...

  5. 信息论霍夫曼编码c语言,Huffman 信息论与编码 - 下载 - 搜珍网

    霍夫曼编码/Shiyan4/Shiyan.sln 霍夫曼编码/Shiyan4/Shiyan.suo 霍夫曼编码/Shiyan4/Shiyan.v11.suo 霍夫曼编码/Shiyan4/Shiyan4 ...

  6. 数据结构编程实践(七)创建哈夫曼树、生成哈夫曼编码、完成图片的压缩与解压缩

    一.对图片的压缩与解压缩,涉及以下内容: 1.文件读写 2.创建Huffman树 3.生成Huffman编码 4.压缩图片文件 5 .  解压缩图片文件 二.将项目分成三个小任务,下一任务是在上一任务 ...

  7. 哈夫曼算法以及求哈夫曼编码

    哈夫曼树又称最优树,是一类带权路径长度最短的树.其中带权路径长度WPL最小的二叉树称作最优二叉树或哈夫曼树. 哈夫曼的构造算法: (1):根据给定的n个权值{w1,w2,w3.....},构造n课只有 ...

  8. 计算机编码问题总结——哈夫曼编码

    我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下计算机中的编码问题,来看第四部分,哈夫曼编码. 哈夫曼树,又叫霍夫曼树.最优二叉树,表示带权路径最短的树,什么意思呢,没听懂...... 唉 ...

  9. labview霍夫曼编码_为什么霍夫曼编码好?

    7 个答案: 答案 0 :(得分:3) 如果为最常用使用的符号指定较少的数字或位或较短的代码字词,则可以节省大量存储空间. 假设您要为英文字母分配26个唯一代码,并希望根据这些代码存储英文小说(仅限字 ...

  10. 哈夫曼编码(基于哈夫曼树-最优二叉树,不唯一)、B树(b-树)、B+树

    整合自: http://blog.csdn.net/shuangde800/article/details/7341289 http://www.cnblogs.com/Jezze/archive/2 ...

最新文章

  1. java.net.ConnectException: Connection refused 异常
  2. modelsim的do文件
  3. java各种集合的线程安全
  4. Metal入门教程(二)三维变换
  5. js判断IE浏览器的方法
  6. 微信支付jsapi并写入数据库--回调函数(notify.php)的使用
  7. JavaScript 页面刷新方式汇总
  8. mysql事务一致性实现原理_MySQL -- 事务的实现原理
  9. 基于MCS-51单片机的数字时钟设计
  10. [阅读笔记]Modern C++ Programming with Test-Driven Develpment chp2
  11. 新浪UC 单文件精简版
  12. 台式计算机可以发射无线网络,台式电脑wifi发射教程
  13. Python中scatter函数参数搞懂之新手上路
  14. 电脑异常蓝屏问题排查记录
  15. 电脑软件测试英雄联盟,lol电脑配置检测,如何测试自己的网络玩lol的具体情况?...
  16. 2022年 Q1书单:17本书《可口可乐传》《随机漫步的傻瓜》等 | δ星 丨读书笔记与书单 notes...
  17. Android Camera(13)HEIF Imaging
  18. 互联网时代的企业管理模式
  19. 将PDF文件转换为Word文档和其他格式
  20. Apache service named reported the following error(OS 10055)由于系统缓冲区空间不足或队列已满解决办法?...

热门文章

  1. Hive学习之六 《Hive进阶— —hive jdbc》 详解
  2. The GDM user does not exist.Please correct gdm configration and restart gdm
  3. Javascript从零开始学习第一天
  4. DeNA/上海纵游通过使用AWS大量缩短新款游戏和服务的上线时间
  5. 搭建证书服务器(2003)学习笔记
  6. tortoiseHg查看后一个版本和parent版本的不同
  7. springMVC 理解大综合
  8. Java 递归求后一个数是前两个数之和
  9. 全国医疗机构勒索病毒事件公告:阿里云发布公益行动
  10. 聊聊spring security oauth2的password方式的认证