1 / 15
文档名称:

哈夫曼编码译码器实验报告.doc

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

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

分享

预览

哈夫曼编码译码器实验报告.doc

上传人:gdntv68 2021/12/18 文件大小:452 KB

下载得到文件列表

哈夫曼编码译码器实验报告.doc

相关文档

文档介绍

文档介绍:. . -.
. . 文档.
问题解析与解题方法
问题分析:
设计一个哈夫曼编码、译码系统。对一个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码的初始化并需要一个数组来保存它们;
定义代表森林的数组,在创立哈夫曼树的过程当中保存被选中的字符,即给定报文中出现的字符,模拟哈夫曼树选取和删除左右子树的过程;
自底而上地创立哈夫曼树,保存根的地址和每个叶节点的地址,即字符的地址,然后自底而上检索,首尾对换调整为哈夫曼树实现哈弗曼编码;
从哈弗曼编码文件当中读入字符,根据当前字符为0或者1的状况左子树或者右孩子,实现解码;
使用文件读写操作哈夫曼编码和解码结果的写入;
解题方法:
构造体、数组、类的定义:
定义构造体类型的signode 作为哈夫曼树的节点,定义构造体类型的hufnode 作为哈夫曼编码对照表的节点,定义HFM类实现对哈夫曼树的创立,利用其成员函数完成哈夫曼编码译码的工作。
. . -.
. . 文档.
定义signode 类型的全局数组SN[256]〔为方便调用,之后的forest[256],hufNode[256]均为全局数组〕, 保存ASCII编码的字符,是否在文章中出现〔bool类型〕以及出现次数〔int类型,权重〕,左右孩子节点位置,父节点位置信息;
为节省存储空间,定义signode * 类型的全局数组forest[256], 模拟森林,在创立哈夫曼树的过程中保存出现字符的指针,模拟哈夫曼树选取和删除左右子树的过程;
定义hufnode 类型的全局数组hufNode[256],在编码时最为哈夫曼编码对照表的节点,char 型c保存字符,int code[100]保存其哈夫曼编码;
定义HFM类,主要保存哈夫曼树的根节点指针,但其丰富的功能函数将实现哈夫曼编码译码的工作及其他功能;
函数介绍:
void init(signode * sig){……} 初始化数组SN[];
void press(){……}输出压缩比照情况的信息;
void exchange(){……}用两层for循环实现hufNode[i]节点的成员哈夫曼编码数组code[]前后元素的对换,因为在之前的编码过程中由于是从叶节点追溯至根节点,存入code数组的哈夫曼编码与哈夫曼编码的概念反向,故而要调整;
signode * getroot(){……}返回哈夫曼树的根节点指针;
signode * HFM::creat(){……}创立哈夫曼树,首先用三个for循环查看forest数组,找到权值最