1 / 15
文档名称:

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

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

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

分享

预览

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

上传人:fy5186fy 2015/5/19 文件大小:0 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[];
press(){……}输出压缩对比情况的信息;
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[h

最近更新

2022-2023年二级建造师之二建机电工程实务题库.. 50页

2022年电子商务专业理论综合真题卷(一)及参考.. 13页

中职英语模拟题(2015年) 28页

中秋佳节致客户的祝福语 21页

九年级上科学第四章知识点总结--全 10页

义务教育课程标准实验教科书语文 10页

中药配伍表 11页

高考化学总复习第一轮复习化学物质及其变化第.. 69页

汽车行业中国汽车市场与营销模式调查分析PPT7.. 79页

内部账户专项治理方案 3页

4.4力学单位制说课比赛获奖课件公开课一等奖课.. 19页

美甲店双向选择方案 2页

机械原理第七版孙桓 20页

红星美凯龙全球招商发布会策划案市公开课一等.. 46页

渔业资源可持续利用 168页

2024年钼矿项目资金筹措计划书代可行性研究报.. 58页

2024年冷冻饮品项目资金筹措计划书代可行性研.. 62页

2024年胶囊内窥项目资金需求报告代可行性研究.. 60页

吸入性肺炎的护理 32页

企业选址与布局 (2) 44页

2024年端子机项目投资申请报告代可行性研究报.. 68页

静脉输液治疗护理学考核试题题库及答案 38页

2024企业主要负责人安全培训考试题及答案优质.. 12页

叙事歌曲《二月里见罢到如今》创作及演唱解析 2页

毕业设计 论文 酒店管理系统 62页

以工代赈项目开工仪式表态发言稿 1页

学前儿童卫生学 220页

酒店管理系统毕业设计(论文设计) 41页

江淮六安YE2电机安装尺寸及技术参数 8页

2014安全评价课程设计任务书 6页