哈夫曼算法实现字符串压缩——实验报告单.doc

上传人:飞****2 文档编号:78731688 上传时间:2023-03-19 格式:DOC 页数:9 大小:528KB
返回 下载 相关 举报
哈夫曼算法实现字符串压缩——实验报告单.doc_第1页
第1页 / 共9页
哈夫曼算法实现字符串压缩——实验报告单.doc_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《哈夫曼算法实现字符串压缩——实验报告单.doc》由会员分享,可在线阅读,更多相关《哈夫曼算法实现字符串压缩——实验报告单.doc(9页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、用哈夫曼编码实现文件压缩实 验 报 告课程名称 数据结构B 实验学期 2011 至 2012 学年 第 一 学期学生所在系部 计算机系 年级 2009级 专业班级 计科B091 学生姓名 韩翼 学号 6 任课教师 盛建瓴 实验成绩 一、实验题目:用哈夫曼编码实现文件压缩二、实验目的:1、 了解文件的概念。2、 掌握线性链表的插入、删除等算法。3、掌握Huffman树的概念及构造方法。4、掌握二叉树的存储结构及遍历算法。5、利用Huffman树及Huffman编码,掌握实现文件压缩的一般原理。三、实验设备与环境:微型计算机、Windows 系列操作系统 、Visual C+6.0软件四、实验内容

2、:根据ascii码文件中各ascii字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。五、概要设计:本次试验采用将字符用长度尽可能短的二进制数位表示方法,即对于文件中出现的字符,无须全部都用8位的ASCLL码进行存储,根据他们在文件中出现的频率不同,我们利用Haffman算法使每个字符能以最短的二进制字符进行存储,以达到节省存储空间,压缩文件的目的。解决了压缩需采用的算法,程序的思路已然清晰:1、 统计需压缩文件中每个字符出现的频率。2、 将每个字符的出现频率作为叶子结点构建Haffman树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支

3、标“1” ; 每个字符的编码即为从根到每个叶子的路径上得到的0、1序列,这样便完成了Haffman编码,将每个字符用最短的二进制字符表示。3、 打开需压缩的文件,再将需压缩文件中的每个ASCII码对应的编码按bit单位输出。4、 文件压缩结束。 六、详细设计:(1)Huffman树简介 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径路径长度:路径上的分支数树的路径长度:从树根到每一个结点的路径长度之和树的带权路径长度:树中所有带权结点的路径长度之和Huffman树设有n个权值w1,w2,wn,构造一棵有n个叶子结点的二叉树,每个叶子的权值为wi,则wpl最小的二叉树叫Huff

4、man树。(2)构造Huffman树的方法Huffman算法构造Huffman树步骤(a)根据给定的n个权值w1,w2,wn,构造n棵只有根结点的二叉树,令起权值为wj。(b)在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。(c)在森林中删除这两棵树,同时将新得到的二叉树加入森林中。(d)重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树。 对于Haffman 的创建算法,有以下几点说明: a) 这里的 Haffman 树采用的是基于数组的带左右儿子结点及父结点下标 作为存储结点的二叉树形式,这种空间上的消耗带来了算法实现上的便

5、捷。 b) 由于对于最后生成的 Haffman 树,其所有叶子结点均为从一个内部树扩充出去的,所以,当外部叶子结点数为m 个时,内部结点数为m-1,整个Haffman树的需要的结点数为2m-1 c) 初始化 Hafffman 树分两步进行,先将所有结点赋值,再将前m 个叶子结点赋初值。 d) 在查找权值最小并且父结点为空的两个结点时,通过逐个比较,将两结 点的位置下标与权值分别保存。方便在与其父结点建立联系时调用。(3)Huffman编码:数据通信用的二进制编码思想:根据字符出现频率编码,使电文总长最短 编码:根据字符出现频率构造Huffman树,然后将树中结点引向其左孩子的分支标“0”, 引

6、向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子的路径上得到的0、1序列。(4)压缩过程的实现: 压缩过程的流程是清晰而简单的:1创建Haffman 树2 打开需压缩文件 3 将需压缩文件中的每个ASCII码对应的Haffman 编码按bit 单位输出􀃆4 文件压缩结束。其中,步骤 1 和步骤3 是压缩过程的关键。 a) 步骤 1:这里所要做工作是得到Haffman 数中各叶子结点字符出现的频 率并进行创建。 b) 步骤 3: 将需压缩文件中的每个ASCII 码对应的Haffman 编码按bit 单位 输出,这是本压缩程序中最关键的部分。 这里涉及“转换”和“输出”

7、两个关键步骤: “转换”部分大可不必去通过遍历Haffman 树来找到每个字符对应的哈夫曼 编码,可以将每个ASCII码值及其对应的ASCII码存放于如下所示的结构体 中:typedef struct char asciiCode;unsigned long haffCode;int haffCodeLen;HaffCode; 创建由该结构体结点所组成的,长度为 128 的一维数组codeList128 且 codeList 中的下标和asciiCode 满足下面的顺序存放关系: codeListi.asciiCode=i; 这样的话,查找某个字符 inChar 的haffman 编码的工作便

8、变得相当轻松了, 如下: sHaffCode=codeListinChar.haffCode; 数组 codeList128的创建可以采用某种遍历方式下的按找到的字符进行置 数的方式,十分的方便。 以下流程图采用的是前序遍历的方式创建:说明:.在流程图中,youBiao 中存放字符对应的Haffman 编码,sDepth 中存放其Haffman 编码的长度。.在代码的编写过程中,可用递归调用实现。(5)“输出”部分是最重要的部分,也是最易出错的部分。这里,涉及到 C 语言的位操作,要求这个算法能处理好以下几个问题:1)每个字符所对应的haffCode 的比特位长度由523 位不等长,不可少 多

9、输,输错任何一位,后一个字符的haffCode 要紧跟在前一个字符的 haffCode后面。 2)最后一个字符要能合理结束。这主要是为解压缩考虑的,比如,在最后一个要输出的haffCode 的最后一位,它恰好是位于最后一个有效字符的第一 位,剩下的七个比特位是要用无效的haffCode 加以填充的。否则,如果填 充的haffCode 亦为某个ascii 字符的haffCode 时,那么在解压缩时,则该在原被压缩文件中不存在的字符便会无中生有的在解压后的文件中出现,这显然是不正确的,应在程序中加以处理。(6) 主函数部分七、测试结果及分析:1、 压缩程序的使用:Code2、 压缩情况:八、教师评语:教 师 评 价评定项目ABCD评定项目ABCD算法正确界面美观,布局合理程序结构合理操作熟练语法、语义正确解析完整实验结果正确文字流畅报告规范题解正确其他:评价教师签名:年 月 日

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com