哈夫曼编码的一个实际应用

在课堂上,我们学习了哈夫曼编码的原理和实现方法,上实验课时也动手实现过,后来我们又追加介绍了哈夫曼编码的实际压缩和解压缩的实现方法,并且在课堂上也演示了,但当时我们却忽略了一个环节,那就是实际文件存储时,二进制是比特位,而存储的单位一般是字节,显示时又是按照十六进制的。现在给你一个已经用哈夫曼方法压缩过的十六进制文件,请你解压以便还原成原文。

Input
本问题有多组测试数据,第一行就是测试数据的组数nCase,对于每组测试数据,一共有四个部分,第一部分是一个字典(请注意,字典里可能含有空格!),原文本里面出现的任何字符一定在这个字典里面,并且已经按照使用频度从大到小顺序排列。第二部分是字典里相对应字符的使用频度。第三部分是待解压的行数n。第四部分是n行经过哈夫曼压缩的十六进制数组成的字符串。

Output
输出一共n行,每行就是对应输入的原文(请注意,输出的原文里可能含有空格!)。

Sample Input
1
AORST
60 22 16 13 6 4
5
7C
F3F2CC3C6FE24D3FC5AB7CC6
98BBD266C6FF81
FE6517F5B6663AF98FE2226676FA80
F317262FCFE662FC99D7D

Sample Output
AO
ASAO RST ATOAATS OSAATRR RRASTO
STROAR SSRTOAAA ||Error !
AASS TRAA RRRSSTA RASTAATTTSSSOOAOR
ASTRO STRAO AASSTRAO SSORAR

Hint
1:由于哈夫曼编码可能不一定唯一,因此我们规定在构建哈夫曼树时,左子树编码为0,右子树编码为1,左子树代表的频度数据小于右子树代表的频度数据,如果两个频度数据相同,则以生成早的为左子树,如果在字典里出现相同频度的字符,则原排在前的为左子树。这样规定目的是确保哈夫曼编码唯一。
2:如果在解压缩过程中,找不到对应的原文,那么在遇到错误后加上字符串“||Error !”,并停止对压缩串的解压。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<map> 
#include<algorithm> 
using namespace std;

struct TREE{
   
    int l,r;
    int now,w;
    string str;

    TREE(){
   };
    TREE(int now,int w,string str)
    {
   
        this->now=now;
        this->w=w;
        this->str=str;
        this->l=this->r=-1;
    }
    TREE(int now,int w,string str,int l,int r)
    {
   
        this->now
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值