博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Haffman编码(haffman树)
阅读量:6416 次
发布时间:2019-06-23

本文共 3462 字,大约阅读时间需要 11 分钟。

Haffman编码

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

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

1.规定哈弗曼树的左子树编码为0,右子树编码为1;

2.若两个字符权值相同,则ASCII码值小的字符为左孩子,大的为右孩子;

3.创建的新节点所代表的字符与它的左孩子的字符相同;

4.所有字符为ASCII码表上32-96之间的字符(即“ ”到“`”之间的字符)。

 
输入
输入包含多组数据(不超过100组) 每组数据第一行一个整数n,表示字符个数。接下来n行,每行有一个字符ch和一个整数weight,表示字符ch所对应的权值,中间用空格隔开。 输入数据保证每组测试数据的字符不会重复。
输出
对于每组测试数据,按照输入顺序输出相应的字符以及它们的哈弗曼编码结果,具体格式见样例。
样例输入
3a 10b 5c 84a 1b 1c 1d 1
样例输出
a:0b:10c:11a:00b:01c:10d:11 题解:让求一颗哈夫曼树,哈夫曼树是先找到最小的两个建一个根节点,这个根节点的权值为两个小的权值和; 加入这个新节点,重新找;用优先队列实现;其根节点即为元素在树中的位置; 代码:
#include
#include
#include
#include
#include
#include
using namespace std;const int INF=0x3f3f3f3f;#define mem(x,y) memset(x,y,sizeof(x))#define SI(x) scanf("%d",&x)#define PI(x) printf("%d",x)typedef long long LL;string ans[300];char c[310];struct Node{ char c; int v; Node *l,*r; Node(){ l=r=NULL; } Node(char ch,int vv,Node *ll=NULL,Node *rr=NULL){ c=ch;v=vv;l=ll;r=rr; } bool operator < (const Node &b) const{ if(v!=b.v)return v>b.v; else return c>b.c; }};Node e[300];void dfs(Node *now,string s){ if(now->l==NULL&&now->r==NULL){ ans[int(now->c)]=s;return; } if(now->l!=NULL)dfs(now->l,s+'0'); if(now->r!=NULL)dfs(now->r,s+'1'); return ;}int main(){ int N,v; //char s[2]; while(~SI(N)){ if(N==0)continue; for(int i=0;i<300;i++)e[i].l=e[i].r=NULL; priority_queue
Q; getchar(); for(int i=0;i
1){ e[tp++]=Q.top(); Q.pop(); e[tp++]=Q.top(); Q.pop(); Q.push(Node(e[tp-2].c,e[tp-2].v+e[tp-1].v,&e[tp-2],&e[tp-1])); //Node(e[tp-2].c这样插是为了当和等于下一个的v的时候排在前边; //为什么要再开一个数组e:为了保持队列里面元素的l,r对应关系; } Node ss; ss=Q.top(); //printf("%c %d\n",ss.c,ss.v); dfs(&ss,""); //printf("****"); for(int i=0;i

 数据结构课后又写了下:优先队列那点要用仿函数写;

代码:

#include "handsomecui.h"#include
#include
struct Node{ int v; char c; Node *l, *r; Node(){ l = NULL; r = NULL; } void init(int v, char c, Node *l = NULL, Node *r = NULL){ this->v = v; this->c = c; this->l = l; this->r = r; }// bool operator < (const Node *a) const{// return v > a->v;//这里的排序有问题 // }};struct cmp{ bool operator() (const Node *a, const Node *b) const{ if(a->v != b->v) return (a->v) > (b->v); else return a->c > b->c; }};priority_queue
, cmp>Q;string ans[300];void dfs(Node *root, string s){ if(root->l == NULL && root->r == NULL){ ans[root->c] = s; return; } if(root->l != NULL){ dfs(root->l, s + '0'); } if(root->r != NULL){ dfs(root->r, s + '1'); }}char s[310];void print(char c){ PI(c, ":"); PI(ans[c] , "\n");}int main(){ int n; int v; while(~scanf("%d", &n)){ if(n == 0) continue; getchar(); while(!Q.empty()) Q.pop(); Node *a, *b, *c; for(int i = 0; i < n; i++){ a = new Node(); scanf("%c%d", &s[i], &v); getchar(); a->init(v, s[i]); Q.push(a); } while(Q.size() > 1){ a = Q.top(); Q.pop(); b = Q.top(); Q.pop(); c = new Node(); c->init(a->v + b->v, a->c, a, b); Q.push(c); } dfs(Q.top(), ""); for_each(s, s + n, print); } return 0;}

 

转载地址:http://gvpra.baihongyu.com/

你可能感兴趣的文章
[经验]无线鼠标和无线键盘真的不能用了?——雷柏的重生之路~
查看>>
【转】plist涉及到沙盒的一个问题
查看>>
GNU make manual 翻译( 一百四十五)
查看>>
重构之美-走在Web标准化设计的路上[复杂表单]3 9 Update
查看>>
linux中的优先搜索树的实现--prio_tree【转】
查看>>
重构之美-跨越Web标准,触碰语义网[开门见山:Microformat]
查看>>
git入门与实践【转】
查看>>
WPF 虚拟键盘
查看>>
储存卡无法打开专家教您怎么数据恢复
查看>>
彼得原理
查看>>
如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库...
查看>>
[20171113]修改表结构删除列相关问题3.txt
查看>>
特征选择
查看>>
在Winform程序中设置管理员权限及为用户组添加写入权限
查看>>
RTMP直播到FMS中的AAC音频直播
查看>>
多能互补提速 加快我国能源转型和现代能源体系建设
查看>>
《JavaScript设计模式》——2.5 多种调用方式——多态
查看>>
Redis开发运维实践高可用和集群架构与实践(二)
查看>>
程序员的常见“谎话”:对,这是一个已知 Bug
查看>>
如何侦查SQL执行状态
查看>>