源于一次实验课,要求实现哈夫曼树、哈夫曼编码与译码;我就直接贴实验要求和代码实现了。
注:因为当时时间有限,故其实该代码还有优化空间,且输出文件是0/1字符串文本(UTF-8)并不是ASCII码编码文件,计算压缩率除以8即可。
实验项目:哈夫曼编码与译码方法
哈夫曼编码是一种以哈夫曼树(最优二叉树,带权路径长度最小的二叉
树)为基础的基于统计学的变长编码方式。其基本思想是:将使用次数多的代
码转换成长度较短的编码,而使用次数少的采用较长的编码,并且保持编码的
唯一可解性。在计算机信息处理中,经常应用于数据压缩。是一种一致性编码
法(又称"熵编码法"),用于数据的无损耗压缩。本实验要求利用贪心算法实
现一个完整的哈夫曼编码与译码系统。
实验内容和实验要求:
- 从文件中读入任意一篇英文文本文件,分别统计英文文本文件中各字符(包
括标点符号和空格)的使用频率; - 根据已统计的字符使用频率构造哈夫曼编码树,并给出每个字符的哈夫曼编
码(字符集的哈夫曼编码表); - 将文本文件利用哈夫曼树进行编码,存储成压缩文件(哈夫曼编码文件);
- 计算哈夫曼编码文件的压缩率;
- 将哈夫曼编码文件译码为文本文件,并与原文件进行比较。
C代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define n 65
//哈夫曼树节点存储结构
typedef struct{
char data;
int weight;
int lchild;
int rchild;
int parent;
}Htnode;
typedef Htnode HuffmanT[129];
//哈夫曼编码表的存储结构
typedef struct{
char ch; //储存被编码的字符
char bits[n+1]; //字符编码位串
}CodeNode;
typedef CodeNode HuffmanCode[n];
//0-9为数字;10-35为小写字母;36-61为大写字母;62-64为特殊字符
void InitHT(HuffmanT T) //初始化
{
char sz = '0';
char xzm = 'a';
char dzm = 'A';
char kong = ' ';
char dh = ',';
char jh = '.';
for(int i=0; i<n; i++)
{
T[i].lchild = T[i].rchild = T[i].parent = -1;
T[i].weight = 0;
if(i>=0&&i<=9)
{
T[i].data = sz;
sz++;
}
if(i>=10&&i<=35)
{
T[i].data = xzm;
xzm++;
}
if(i>=36&&i<=61)
{
T[i].data = dzm;
dzm++;
}
if(i>=62&&i<=64)
{
T[62].data = kong;
T[63].data = dh;
T[64].data= jh;
}
}
for(int j = n; j<2*n-1; j++)
{
T[j].weight = 0;
T[j]

9374

被折叠的 条评论
为什么被折叠?



