哈夫曼算法实现字符串压缩——实验报告单.doc_第1页
哈夫曼算法实现字符串压缩——实验报告单.doc_第2页
哈夫曼算法实现字符串压缩——实验报告单.doc_第3页
哈夫曼算法实现字符串压缩——实验报告单.doc_第4页
哈夫曼算法实现字符串压缩——实验报告单.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华北科技学院 用哈夫曼编码实现文件压缩实验报告用哈夫曼编码实现文件压缩实 验 报 告课程名称 数据结构B 实验学期 2011 至 2012 学年 第 一 学期学生所在系部 计算机系 年级 2009级 专业班级 计科B091 学生姓名 韩翼 学号 200907014106 任课教师 盛建瓴 实验成绩 一、实验题目:用哈夫曼编码实现文件压缩二、实验目的:1、 了解文件的概念。2、 掌握线性链表的插入、删除等算法。3、掌握Huffman树的概念及构造方法。4、掌握二叉树的存储结构及遍历算法。5、利用Huffman树及Huffman编码,掌握实现文件压缩的一般原理。三、实验设备与环境:微型计算机、Windows 系列操作系统 、Visual C+6.0软件四、实验内容:根据ascii码文件中各ascii字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。五、概要设计:本次试验采用将字符用长度尽可能短的二进制数位表示方法,即对于文件中出现的字符,无须全部都用8位的ASCLL码进行存储,根据他们在文件中出现的频率不同,我们利用Haffman算法使每个字符能以最短的二进制字符进行存储,以达到节省存储空间,压缩文件的目的。解决了压缩需采用的算法,程序的思路已然清晰:1、 统计需压缩文件中每个字符出现的频率。2、 将每个字符的出现频率作为叶子结点构建Haffman树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1” ; 每个字符的编码即为从根到每个叶子的路径上得到的0、1序列,这样便完成了Haffman编码,将每个字符用最短的二进制字符表示。3、 打开需压缩的文件,再将需压缩文件中的每个ASCII码对应的编码按bit单位输出。4、 文件压缩结束。 六、详细设计:(1)Huffman树简介 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径路径长度:路径上的分支数树的路径长度:从树根到每一个结点的路径长度之和树的带权路径长度:树中所有带权结点的路径长度之和Huffman树设有n个权值w1,w2,wn,构造一棵有n个叶子结点的二叉树,每个叶子的权值为wi,则wpl最小的二叉树叫Huffman树。(2)构造Huffman树的方法Huffman算法构造Huffman树步骤(a)根据给定的n个权值w1,w2,wn,构造n棵只有根结点的二叉树,令起权值为wj。(b)在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。(c)在森林中删除这两棵树,同时将新得到的二叉树加入森林中。(d)重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树。 对于Haffman 的创建算法,有以下几点说明: a) 这里的 Haffman 树采用的是基于数组的带左右儿子结点及父结点下标 作为存储结点的二叉树形式,这种空间上的消耗带来了算法实现上的便捷。 b) 由于对于最后生成的 Haffman 树,其所有叶子结点均为从一个内部树扩充出去的,所以,当外部叶子结点数为m 个时,内部结点数为m-1,整个Haffman树的需要的结点数为2m-1 c) 初始化 Hafffman 树分两步进行,先将所有结点赋值,再将前m 个叶子结点赋初值。 d) 在查找权值最小并且父结点为空的两个结点时,通过逐个比较,将两结 点的位置下标与权值分别保存。方便在与其父结点建立联系时调用。(3)Huffman编码:数据通信用的二进制编码思想:根据字符出现频率编码,使电文总长最短 编码:根据字符出现频率构造Huffman树,然后将树中结点引向其左孩子的分支标“0”, 引向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子的路径上得到的0、1序列。(4)压缩过程的实现: 压缩过程的流程是清晰而简单的:1创建Haffman 树2 打开需压缩文件 3 将需压缩文件中的每个ASCII码对应的Haffman 编码按bit 单位输出4 文件压缩结束。其中,步骤 1 和步骤3 是压缩过程的关键。 a) 步骤 1:这里所要做工作是得到Haffman 数中各叶子结点字符出现的频 率并进行创建。 b) 步骤 3: 将需压缩文件中的每个ASCII 码对应的Haffman 编码按bit 单位 输出,这是本压缩程序中最关键的部分。 这里涉及“转换”和“输出”两个关键步骤: “转换”部分大可不必去通过遍历Haffman 树来找到每个字符对应的哈夫曼 编码,可以将每个ASCII码值及其对应的ASCII码存放于如下所示的结构体 中:typedef struct char asciiCode;unsigned long haffCode;int haffCodeLen;HaffCode; 创建由该结构体结点所组成的,长度为 128 的一维数组codeList128 且 codeList 中的下标和asciiCode 满足下面的顺序存放关系: codeListi.asciiCode=i; 这样的话,查找某个字符 inChar 的haffman 编码的工作便变得相当轻松了, 如下: sHaffCode=codeListinChar.haffCode; 数组 codeList128的创建可以采用某种遍历方式下的按找到的字符进行置 数的方式,十分的方便。 以下流程图采用的是前序遍历的方式创建:说明:.在流程图中,youBiao 中存放字符对应的Haffman 编码,sDepth 中存放其Haffman 编码的长度。.在代码的编写过程中,可用递归调用实现。(5)“输出”部分是最重要的部分,也是最易出错的部分。这里,涉及到 C 语言的位操作,要求这个算法能处理好以下几个问题:1)每个字符所对应的haffCode 的比特位长度由523 位不等长,不可少 多输,输错任何一位,后一个字符的haffCode 要紧跟在前一个字符的 haffCode后面。 2)最后一个字符要能合理结束。这主要是为解压缩考虑的,比如,在最后一个要输出的haffCode 的最后一位,它恰好是位于最后一个有效字符的第一 位,剩下的七个比特位是要用无效的haffCode 加以填充的。否则,如果填 充的haffCode 亦为某个ascii 字符的haffCode 时,那么在解压缩时,则该在原被压缩文件中不存在的字符便会无中生有的在解压后的文件中出现,这显然是不正确的,应在程序中加以处理

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论