ACM 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
- 3
- 样例输出
-
- a:0
- b:10
- c:11
- a:00
- b:01
- c:10
- d:11
注意题目要求是按照按照输入顺序输出相应的字符以及它们的哈弗曼编码结果
- #include <iostream>
- #include <queue>
- #include <string>
- #include <algorithm>
- #include <vector>
- #include <cstdio>
- #include <sstream>
- using namespace std;
- struct HuffManTree;
- struct HuffManTreeCmp;
- typedef HuffManTree* HuffManTreePtr;
- typedef priority_queue<HuffManTreePtr,vector<HuffManTreePtr>,HuffManTreeCmp> HuffManQueue;
- struct HuffManTree{
- int freq;
- char key;
- HuffManTree *left,*right;
- HuffManTree(int freq_ = , char key_='\0'):freq(freq_),key(key_),left(NULL),right(NULL){}
- };
- struct HuffManTreeCmp{
- bool operator()(const HuffManTreePtr &a, const HuffManTreePtr &b)
- {
- if(a->freq !=b->freq) return a->freq > b->freq;
- else return a->key > b->key;
- return a->freq > b->freq;
- }
- };
- HuffManTree* huffman(HuffManQueue& huffmanQueue){
- while(huffmanQueue.size() > ){
- HuffManTree *leftNode = huffmanQueue.top(); huffmanQueue.pop();
- HuffManTree *rightNode = huffmanQueue.top();huffmanQueue.pop();
- if(leftNode->freq == rightNode->freq && leftNode->key > rightNode->key) swap(leftNode->key,rightNode->key);
- HuffManTree *node= new HuffManTree(leftNode->freq+rightNode->freq,leftNode->key);
- node->left = leftNode;node->right = rightNode;
- huffmanQueue.push(node);
- }
- return huffmanQueue.top();
- }
- void print_huffman(vector<string>& res,HuffManTree *root, string code=""){
- if(NULL == root) return;
- if(root->left) code+='';
- print_huffman(res,root->left,code);
- if(!root->left && ! root->right){
- string tmpRes(,root->key);
- tmpRes+=":"+code;
- res.push_back(tmpRes);
- }
- code = code.substr(,code.length()-);
- if(root->right) code+='';
- print_huffman(res,root->right,code);
- }
- int main(){
- int n;
- while(cin >> n){
- HuffManQueue huffmanQueue;
- vector<char> record;
- cin.ignore();
- for(int i = ; i < n; ++ i){
- string input;
- getline(cin,input);
- char ch = input[];
- int freq = atoi(input.substr().c_str()) ;
- record.push_back(ch);
- huffmanQueue.push(new HuffManTree(freq,ch));
- }
- HuffManTree *root = huffman(huffmanQueue);
- vector<string> res;
- print_huffman(res,root);
- for(int i = ; i< record.size(); ++ i){
- for(int j = ; j < res.size(); ++ j){
- if(res[j][]== record[i]){
- cout<<res[j]<<endl;
- break;
- }
- }
- }
- }
- }
- a:0
ACM Haffman编码的更多相关文章
- Haffman编码(haffman树)
Haffman编码 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去...).现在给你一串字符以及它们所对应的权值 ...
- java实现Haffman编码
1.先创建一个树节点类(泛型类),为了方便使用集合的排序方法,泛型类要实现泛型接口Comparable,代码如下 package com.hjp.huffman; /** * Created by J ...
- Haffman编码
Huffman树又称为最优树,是一种带权路径最短的树. 一.带权路径 在一棵树中我们把一个节点到另一个节点之间的通路叫做路径,在路径中每经过一个节点路径的长度就加一.如果对一个节点附上权值,则该节点的 ...
- 转载一篇关于unicode字符编码的文章
很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节". 再后来,他们又做了一 ...
- Python 学习之进制与编码
进制 日常生活中,我们最熟悉的数据就是十进制计数.它的数值部分由十个不同的数字符号0.1.2.3.4.5.6.7.8.9来表示,我们把这些数字符号叫做数码,表示十种不同的状态.数码处于不同的位置(或数 ...
- Ansi,UTF8,Unicode,ASCII编码的差别
近日须要不同的编码,关于上述编码,一直迷迷糊糊,查了些资料,总算大致了解了,以下全是从网上搜来的: 1. ASCII和Ansi编码 字符内码(charcter code)指的是用来代表字符的内 ...
- 文件压缩小项目haffman压缩
文件压缩的原理: 文件压缩总体可以分为有损压缩和无损压缩两类,有损压缩是指对mp3等格式的文件,忽略一些无关紧要的信息,只保留一些关键的信息,但并不因此影响用户对于这些mp3格式文件的体验度,无损压缩 ...
- Ansi,UTF8,Unicode,ASCII编码的区别 ---我看完了 明白了很多
来自:http://blog.csdn.net/xiongxiao/article/details/3741731 ------------------------------------------ ...
- JPEG编码(二)
来自CSDN评论区http://bbs.csdn.net/topics/190980 1. 色彩模型 JPEG 的图片使用的是 YCrCb 颜色模型, 而不是计算机上最常用的 RGB. 关于色彩模型, ...
随机推荐
- redis 列出所有的键
> KEYS * (empty list or set)
- 七牛:关于图片 EXIF 信息中旋转参数 Orientation 的理解
EXIF(Exchangeable Image File)是 “可交换图像文件” 的缩写,当中包含了专门为数码相机的照片而定制的元数据,可以记录数码照片的拍摄参数.缩略图及其他属性信息,简单来说,Ex ...
- 在RedHat.Enterprise.Linux_v6.3系统中安装Oracle_11gR2教程
在RedHat.Enterprise.Linux_v6.3系统中安装Oracle_11gR2教程 本教程提供PDF格式下载: 在RedHat.Enterprise.Linux_v6.3系统中安装Ora ...
- JavaScript获取当前根目录
JavaScript获取当前根目录 主要用到Location 对象,包含有关当前 URL 的信息,是 Window 对象的一个部分,可通过 window.location 属性来访问. 方法一 (wi ...
- 在ASP.NET 5中读取配置文件
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 在ASP.NET 5中摒弃了之前配置文件的基础结构,引入了一个全新配置文件系统.今天推荐的文 ...
- VMware报错:“device eth0 does not seem to be present, delaying initialization ”
转自:http://blog.sina.com.cn/s/blog_77126fa501018s3d.html vmlite虚拟机启动出错,就把这个虚拟机删除掉重新建立,系统虚拟硬盘使用之前的,启动系 ...
- [unity3d插件]2dtoolkit系列一 创建精灵
从今天开始要做一个2d游戏,由于之前都是做cocos2dx的,然后接触了一段时间的unity3d,都是做3D方面的东西,得知要做2d游戏还是有点开心的,或许因为不想丢失之前的2d游戏的一些思想,然后接 ...
- android selector(转)
Selector的结构描述: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:a ...
- 类模板Queue的实现
#include <iostream> #include <vector> using namespace std; template <class Type> c ...
- winform基础窗体设置及基础控件
WinForm - 也叫做C/S 客户端 另:B/S是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点: 不需要联网也可以打开使用部分功能,但是现在的情况是许多功能依然需要 ...