7-63 哈夫曼编码 (30 分)
给定一段文字,如果我们统计出字母出现的频率,是可以根据哈夫曼算法给出一套编码,使得用此编码压缩原文可以得到最短的编码总长。然而哈夫曼编码并不是唯一的。例如对字符串"aaaxuaxz",容易得到字母 'a'、'x'、'u'、'z' 的出现频率对应为 4、2、1、1。我们可以设计编码 {'a'=0, 'x'=10, 'u'=110, 'z'=111},也可以用另一套 {'a'=1, 'x'=01, 'u'=001, 'z'=000},还可以用 {'a'=0, 'x'=11, 'u'=100, 'z'=101},三套编码都可以把原文压缩到 14 个字节。但是 {'a'=0, 'x'=01, 'u'=011, 'z'=001} 就不是哈夫曼编码,因为用这套编码压缩得到 00001011001001 后,解码的结果不唯一,"aaaxuaxz" 和 "aazuaxax" 都可以对应解码的结果。本题就请你判断任一套编码是否哈夫曼编码。
输入格式:
首先第一行给出一个正整数 N(2≤N≤63),随后第二行给出 N 个不重复的字符及其出现频率,格式如下:
c[1] f[1] c[2] f[2] ... c[N] f[N]
其中c[i]
是集合{'0' - '9', 'a' - 'z', 'A' - 'Z', '_'}中的字符;f[i]
是c[i]
的出现频率,为不超过 1000 的整数。再下一行给出一个正整数 M(≤1000),随后是 M 套待检的编码。每套编码占 N 行,格式为:
c[i] code[i]
其中c[i]
是第i
个字符;code[i]
是不超过63个'0'和'1'的非空字符串。
输出格式:
对每套待检编码,如果是正确的哈夫曼编码,就在一行中输出"Yes",否则输出"No"。
注意:最优编码并不一定通过哈夫曼算法得到。任何能压缩到最优长度的前缀编码都应被判为正确。
输入样例:
7
A 1 B 1 C 1 D 3 E 3 F 6 G 6
4
A 00000
B 00001
C 0001
D 001
E 01
F 10
G 11
A 01010
B 01011
C 0100
D 011
E 10
F 11
G 00
A 000
B 001
C 010
D 011
E 100
F 101
G 110
A 00000
B 00001
C 0001
D 001
E 00
F 10
G 11
输出样例:
Yes
Yes
No
No
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string>
void sort(int arr[], int Left, int Right) {//冒泡排序int flag = 1;for (int i = Left; i <= Right && flag; i++) {flag = 0;for (int j = Left; j < Right - i + Left; j++) {if (arr[j] > arr[j + 1]) {flag = 1;int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}
int main() {int N;char c;scanf("%d", &N);int Parent_Sum = 0, Huffqueue[64] = { 0 }, top = 0, f[64] = { 0 };for (int i = 0; i < N; i++) {getchar();scanf("%c %d", &c, &Huffqueue[top++]);f[top - 1] = Huffqueue[top - 1];}int head = 0;sort(Huffqueue, head, N - 1);while (top != head + 1) {//判断队列是否只剩一个元素int n1 = Huffqueue[head];Huffqueue[head] = 0;int n2 = Huffqueue[++head];Huffqueue[head] = 0;Huffqueue[head] = n1 + n2;sort(Huffqueue, head, N - 1);Parent_Sum += n1 + n2;}int M;scanf("%d", &M);for (int k = 0; k < M; k++) {char code[64][63] = { 0 };int WPL = 0;for (int i = 0; i < N; i++) {getchar();scanf("%c %s", &c, code[i]);WPL += (int)strlen(code[i]) * f[i];}if (WPL != Parent_Sum) {printf("No\n");}else if (Parent_Sum == WPL) {int flag = 1;for (int i = 0; i < N; i++) {for (int j = 0; j < N & j != i; j++) {if (strlen(code[i]) <= strlen(code[j]) && strncmp(code[i], code[j], strlen(code[i]))==0) {flag = 0;break;}else if (strlen(code[i]) > strlen(code[j]) && strncmp(code[i], code[j], strlen(code[j]))==0) {flag = 0;break;}}if (!flag)break;}if (!flag)printf("No\n");elseprintf("Yes\n");}}system("pause");return 0;
}
7-63 哈夫曼编码 (30 分)相关推荐
- 7-1 哈夫曼编码 (30分)
文章目录 7-1 哈夫曼编码 (30分) 输入格式: 输出格式: 输入样例: 输出样例: 题解 代码 7-1 哈夫曼编码 (30分) 给定一段文字,如果我们统计出字母出现的频率,是可以根据哈夫曼算法给 ...
- 7-2 哈夫曼编码 (30 分)
2019.12.15更正Best函数样本数据初始化问题并且对代码添加了注释; 2020.11.17更正:题目说明: 原贴发于2019.11.22 注意:本题不是哈夫曼编码裸题,学习哈夫曼编码的同学不要 ...
- 进阶实验4-3.5 哈夫曼编码 (30 分)
仅供参考 #include <iostream> #include <cstdio> #include <queue> #include <string> ...
- 哈夫曼树哈夫曼编码(已知A,B,C,D,E,F,G的概率分别为:17,25,50,67,40,60,30.画出其哈夫曼树和每个字符对应的哈夫曼编码)
[也可以哈夫曼树与最优不等长编码] 已知A,B,C,D,E,F,G的概率分别为:17,25,50,67,40,60,30.画出其哈夫曼树和每个字符对应的哈夫曼编码.
- 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算
1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...
- JPEG霍夫曼编码教程
转译自:https://www.impulseadventure.com/photo/jpeg-huffman-coding.html 量化后,霍夫曼/熵编码是JPEG压缩文件大小节省的重要因素之一. ...
- 递归求解并生成哈夫曼编码的代码实现
一开始我用的三叉链表来生成哈夫曼编码,这一点都不递归.后来我想起了一度被递归统治地恐惧,我发现哈夫曼树不仅编码可以简单的用递归来求,树的WPL也可以. 改善后的递归版本如下,虽然WPL也可以通过递归来 ...
- labview霍夫曼编码_哈夫曼编解码压缩解压文件—C++实现
前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...
- 贪心算法(Greedy Algorithm)之霍夫曼编码
文章目录 1. 贪心算法 2. 应用 2.1 找零钱 2.2 区间覆盖 2.3 霍夫曼编码 霍夫曼编码完整代码 1. 贪心算法 我们希望在一定的限制条件下,获得一个最优解 每次都在当前的标准下做出当下 ...
最新文章
- 无法显示验证码去掉html,后台登陆验证码无法显示
- View绘制原理 —— 画在哪?
- Poj 2186 Popular Cows(Tarjan 强连通缩点)
- 7.1 函数的一般形式
- golang匿名组合
- python 虚拟环境使用
- Python Tornado
- linux线程一直在增加,在.net core中遇到的奇怪问题:内存与线程数一直增长
- MATLAB table数据结构 再篇
- mysql表jiayi_MySQL Memory存储引擎:优势及性能测试
- Jenkins邮件配置,实现邮件发送策略(可实现每个Job对应不同的发送邮箱)
- 安卓连接mysql代码_用Eclipse开发android,怎么连接到数据库,最好有详细程序代码...
- powercmd注册码
- 激光雷达和毫米波雷达的区别
- 【案例实战】餐饮企业分店财务数据分析系统解决方案:业务需求
- C语言中意想不到的地方——第七周作业
- 阿里云iconfont使用方法
- 使用YYLabel编写直播间消息样式
- win7右键显示隐藏文件及扩展名
- 什么是关联分析?如何利用关联规则做好数据挖掘
热门文章
- 如何从官方网站下载jdk1.7?
- MES项目导入-案例分析-XC-MES成就飞毛腿的高效与协同
- 多个xml文件转coco格式、coco转VOC格式(xml)
- QQ新中国象棋棋盘基址--寻找过程
- Python dataframe.pivot()用法解析
- 图解 Google V8 # 01:V8 是如何执行一段 JavaScript 代码的?
- 英语口语312之每日二十个英语单词
- 致我们那年青春热血的高考
- 忘记密码情况下卸载诺顿杀毒软件的方法(未验证)
- html5独立钻石棋,独立钻石跳棋问题的C++实现