哈夫曼编码的一个实际应用(压缩与解压)

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

Input

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

Output

输出一共n行,每行就是原文对应的十六进制压缩码。

 

特别说明:

1:由于哈夫曼编码可能不一定唯一,因此我们规定在构建哈夫曼树时,左子树编码为0,右子树编码为1,左子树代表的频度数据小于右子树代表的频度数据,如果两个频度数据相同,则以生成早的为左子树,如果在字典里出现相同频度的字符,则原排在前的为左子树。这样规定目的是确保哈夫曼编码唯一。

2:如果在压缩过程中,用哈夫曼方法压缩后二进制码的长度不是8的倍数,在码的最后添数字‘0’使其长度成为8的倍数(注意最多添7个‘0’)。

Sample Input

1
 AORST
60 22 16 13 6 4
3
 AO
ASAO RST ATOAATS  OSAATRR RRASTO
STROAR  SSRTOAAA

Sample Output

7C
F3F2CC3C6FE24D3FC5AB7CC6
98BBD266C6FF80


下面是实现压缩的代码:

#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=now;
        this->w=w;
        this->str=str;
        this->l=l;
        
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值