BUAA_Huffman编码文件压缩

【问题描述】(选做,与实验题类似,不计分)

编写一程序采用Huffman编码对一个正文文件进行压缩。具体压缩方法如下:

  1. 对正文文件中字符(换行字符’'除外,不统计)按出现次数(即频率)进行统计

  2. 依据字符频率生成相应的Huffman树(未出现的字符不生成)

  3. 依据Huffman树生成相应字符的Huffman编码

  4. 依据字符Huffman编码压缩文件(即按照Huffman编码依次输出源文件字符)。

说明:

  1. 只对文件中出现的字符生成Huffman,注意:一定不要处理\n,即不要为其生成Huffman码。

  2. 采用ASCII码值为0的字符作为压缩文件的结束符(即可将其出现次数设为1来参与编码).

  3. 在生成Huffman树时,初始在对字符频率权重进行(由小至大)排序时,频率相同的字符ASCII编码值小的在前,在依次取出有序权重序列中权重最小的两个节点时将分别作为新生成树的左右子节点;新生成的权重节点插入到有序权重序列中时,出现相同权重时,插入到其后(采用稳定排序)。

  4. 遍历Huffman树生成字符Huffman码时,左边为0右边为1。

  5. 源文件是文本文件,字符采用ASCII编码,每个字符占8位;而采用Huffman编码后,高频字符编码长度较短(小于8位),因此最后输出时需要使用C语言中的位运算将字符Huffman码依次输出到每个字节中。

【输入形式】

对当前目录下文件input.txt进行压缩。

【输出形式】

将压缩后结果输出到文件output.txt中,同时将压缩结果用十六进制形式(printf("%x",…))输出到屏幕上,以便检查和查看结果。

【样例输入1】

若当前目录下input.txt中内容如下:

aaabbc

【样例输出1】

15f0

同时程序将压缩结果输出到文件output.txt中。

【样例说明】

输入文件中字符的频率为:a为3,b为2,c为1,此外,\0字符将作为压缩文件的结束标志,其出现次数设为1。因此,采用Huffman码生成方法,它们的Huffman编码分别为:

a : 0

b : 10

c : 111

\0 : 110

因此,最终文件压缩结果(按位)为:

0001010111110000

将上述结果按字节按十六进制输出到屏幕上则为15f0(即0001010 111110000的十六进制表示)。

说明:采用Huffman码输出字符序列长度为:1+1+1+2+2+3+3=13(位),由于C语言中输出的最小单位为字节(8位),因此,最后补了三个位0,压缩后实际输出为2个字节。由于文本文件是按ASCII来解释的,因此,以文本方式打开压缩文件将显示乱码(最好用二进制文件查看器来看)。

【样例输入2】

若当前目录下input.txt中内容如下:

do not spend all that you have.do not sleep as long as you want.

【样例输出2】

ea3169146ce9eee6cff4b2a93fe1a5d462d21d9a87c0eb2f3eb2a9cfe6cae

同时程序将压缩结果输出到文件output.txt中。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>

typedef struct T
{
   
	int c;
	int n;
	struct T *l;
	struct T *r;
} t;
typedef struct S
{
   
	struct T *tr;
	struct S *before;
	struct S *next;
} s;

t *Ptr(char c, int q);
s *inS(s *top, t *e);
s *Cut(s *stack);
void Ord(s *start);
int Read(t *b, int c, int d);

int a[129], z = 0;
char book[129
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构中的Huffman编码是一种用于数据压缩的方法。它通过统计待压缩文件中各个字符出现的频率,然后根据频率构建出一棵哈夫曼树。在哈夫曼树中,出现频率高的字符被编码为较短的二进制数,而出现频率低的字符则被编码为较长的二进制数。这样,在压缩文件时,出现频率较高的字符占用较少的位数,从而实现了对文件压缩。 对于txt格式的文件,我们可以首先统计文件中各个字符的出现频率,并根据频率构建Huffman树。构建Huffman树的过程可以使用优先队列来实现,它可以方便地维护字符频率的有序性。构建完Huffman树后,我们可以根据树的结构为每个字符生成相应的编码。 在压缩文件时,我们可以将每个字符的编码组合成一串二进制数字,并将这些二进制数字存储到一个文件中。此文件即为压缩后的文件。在解压缩时,我们可以读取压缩文件中的二进制数字,并根据Huffman树的结构进行解码,还原出原始的txt文件Huffman编码是一种无损压缩算法,即压缩后的文件可以完全还原为原始文件。它的压缩率受文件中字符频率分布的影响,字符出现频率越高,则对应的编码长度越短,压缩率越高。因此,对于频率分布不均匀的txt文件Huffman编码可以取得较好的压缩效果。 综上所述,Huffman编码是一种可以用于对txt格式文件进行压缩与解压的数据结构方法。它通过统计字符频率,构建Huffman树,并根据树的结构进行编码和解码,实现了对文件压缩和解压缩

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值