1 / 24
文档名称:

哈夫曼编码译码器实验报告(免费).doc

格式:doc   大小:4,703KB   页数:24页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

哈夫曼编码译码器实验报告(免费).doc

上传人:916581885 2021/12/10 文件大小:4.59 MB

下载得到文件列表

哈夫曼编码译码器实验报告(免费).doc

相关文档

文档介绍

文档介绍:哈夫曼编码译码器实验报告(免费)
LT
问题解析与解题方法
问题分析:
设计一个哈夫曼编码、译码系统。对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件;反过来,可将编码文件译码还原为一个文本文件。
从文件中读入任意一篇英文短文(文件为ASCII编码,扩展名为txt);
统计并输出不同字符在文章中出现的频率(空格、换行、标点等也按字符处理);
根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码;
将文本文件利用哈夫曼树进行编码,存储成压缩文件()
用哈夫曼编码来存储文件,并和输入文本文件大小进行比较,计算文件压缩率;
进行译码,将huf文件译码为ASCII编码的txt文件,与原txt文件进行比较。
根据上述过程可以知道该编码译码器的关键在于字符统计和哈夫曼树的创建以及解码。
哈夫曼树的理论创建过程如下:
一、构成初始集合
  对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。
二、选取左右子树
  在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
三、删除左右子树
  从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
四、重复二和三两步,
  重复二和三两步,直到集合F中只有一棵二叉树为止。
因此,有如下分析:
我们需要一个功能函数对ASCII码的初始化并需要一个数组来保存它们;
void exchange(){……}用两层for循环实现hufNode[i]节点的成员哈夫曼编码数组code[]前后元素的对换,因为在之前的编码过程中由于是从叶节点追溯至根节点,存入code数组的哈夫曼编码与哈夫曼编码的概念反向,故而要调整;
signode * getroot(){……}返回哈夫曼树的根节点指针;
signode * HFM::creat(){……}创建哈夫曼树,首先用三个for循环查看forest数组,找到权值最小的两个字符,以int型的min1,min2记录其下标,定义signode * 类型指针pp指向新生成signode节点,用指针操作使pp指向的节点的权值为min1,min2权值之和,pp做孩子指向forest[min1],右孩子指向forest[min2],min1,min2的父指针指向pp,然后将pp存入min1的位置,min2之后的每一个节点依次往前移一个位置,实现从forest数组中清除min1,min2并加入pp的操作;
void HFM::hufcode(){……}哈夫曼编码,用for循环控制查看hufNode 数组,其初始化已在creat()的开始完成,对每一个字符实现编码,用while循环从叶节点开始,如果该节点是其父节点的左孩子就将code[
hufNode[i].size++]赋值0,否则赋为1,直至当前节点的父节点为空,while循环结束;
void HFM::savewithhufcode(FILE * inf,FILE * outf){……}将读入的文章以哈夫曼编码的形式存储,其中inf为读入文件的指针,outf为写入文件的指针,首先调用rewind(inf)函数将光标放置在文章开头,防止文件未关闭导致的错误,每读一个字符就用for循环在hufNode 数组中查找,因为hufNode 数组就是保存出现的字符的,故一定可以找到,然后再用fputc函数将code[]数组的内容写入文件,直至读入文件结束;
void HFM::inorder(signode * sig){……}迭代法遍历树,遍历到叶节点时执行hufNode[count++].sig=sig语句实现hufNode 数组指向文章中出现的字符;
int HFM::maxc(){……} 计数变量,记录哈夫曼编码最大位数;
void HFM::hufdecode(FILE* ipf,FILE* opf){……}解码,从哈夫曼编码到字符,输出到屏幕和指定的文件中;
void input(FILE * f){……}初始读入文章,保存出现的字符记录修改其权重;
数据结构选择与算法设计
数据结构选择:
signode:
struct signode{ //signode节点,哈夫曼树节点//
char c;