收藏 分享(赏)

数据结构课程设计报告 压缩与解压缩系统.doc

上传人:cjc2202537 文档编号:1717820 上传时间:2018-08-19 格式:DOC 页数:8 大小:85.50KB
下载 相关 举报
数据结构课程设计报告 压缩与解压缩系统.doc_第1页
第1页 / 共8页
数据结构课程设计报告 压缩与解压缩系统.doc_第2页
第2页 / 共8页
数据结构课程设计报告 压缩与解压缩系统.doc_第3页
第3页 / 共8页
数据结构课程设计报告 压缩与解压缩系统.doc_第4页
第4页 / 共8页
数据结构课程设计报告 压缩与解压缩系统.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、南京师范大学泰州学院数据结构课程设计报告压缩与解压缩系统目 录一、问题描述- 3二、算法思想- 32.1 *-32.2 *- 42.3 *- 52.4 *- 5三、算法实现- 63.1 数据结构 3.2 程序模块3.3 各模块之间的调用关系四、测试与分析 - 7五、总结- 8六、参考文献一 问题描述设计目标是要实现哈夫曼压缩的编码器和译码器。编码器工作如下:首先读入待压缩文件,然后对每种字符出现的频度进行统计,以频率作为建立哈夫曼树的权值。接着建立哈夫曼树,对出现的每种字符进行哈夫曼编码。此时再读入原文件,逐个字节进行编码,将得到的编码流逐个写入文件。译码过程相对简单:读入被压缩文件,根据哈夫

2、曼树对文件中的字符逐个译码,将译码结果逐个写入文件。二、算法思想1 哈夫曼树是哈夫曼算法的理论描述工具,也称最优二叉树,是一种加权路径长度最短的二叉树。加权路径长度是指树中所有叶子结点的权值乘上其到根结点的路径长度。N 个叶子结点的哈夫曼树共有 2n-1 个结点,这个性质将运用于使用数组结构存储哈夫曼树,从根结点开始,左子结点分配 0,右子结点分配 1,沿着树根到各个结点就得到了哈夫曼编码,因为所有被编码的字符都作为叶子结点出现而每个叶子结点路径又是独立的,保障了每个编码都不会四其余码的前缀,这样的编码又称“哈夫曼无重复前缀编码” ,着在下面的程序段会应用到。2 哈夫曼树也应用于译码过程,译码

3、过程中逐一扫描码文,从哈夫曼的根结点开始,将扫描得到的二进制位串中的相邻位与哈夫曼树上的 0,1 匹配。三、算法实现3.1 数据结构 typedef struct char ch;int weight;charweight;定义结构模块 charweightCh(字符) Weight(权值)typedef struct hftnode int weight;int parent,lchild,rchild;HFMNode;建立哈夫曼二叉树 HFMNodeweight parent lchild rchildtypedef struct hc char ch;int start;char lin

4、k100;HFMCode;哈夫曼编码 HFMCodech start link0。 。 。 。 。3.2 程序模块1.从文件中读出字符和出现的频率数(权值)int readfile(char src,charweight *flist);2.根据字符和权值创建哈夫曼树void Create_HFM(int n,charweight *flist,HFMNode *hfmtree);3.找出权值最小的两个void select(int n,int *n1,int *n2,HFMNode *hfmtree);4.定义一个编码表void init_hfmcode(int n,charweight *

5、flist,HFMCode *hfmcode);5.通过二叉树构建编码表内部值void Create_hfmcode(int n,HFMNode *hfmtree,HFMCode *hfmcode);6.在文件中输出字符和权值WriteHead(char *,charweight *,int);ad7.根据哈夫曼树和带有字符和权值的文件输出编码void Translate(char *srcfile,char *desfile,int n,HFMCode *hfmcode);3.3 各模块之间的调用关系Main(调用)readfile 和 create_hfmselect 和 writehea

6、d和 translateinit_hfmcode四、测试与分析要求分析设计目标是要实现哈夫曼压缩的编码器和译码器。码器工作如下:首先读入待压缩文件为了保证与原文件信息完全一致,对文件的读写都采用二进制的方式进行。然后建立并分析字母表,最多只有 256 种可能的符,对每种字符出现的频度进行统计,以频度作为建立哈夫曼树的权值。频度表建立好以后,可以建立哈夫曼树,对出现的每种字符进行哈夫曼编码。此时再读入原文件,逐个字节进行编码,将得到的编码流逐个写入文件。译码过程相对简单:读入被压缩文件,将其解释为比特流,根据哈夫曼树对比特流逐个译码,将译码结果逐个写到磁盘文件。数据压缩有 2 种基本类型:无损压

7、缩和有损压缩,使用无损压缩方法压缩的文件不会丢失任何信息,他与原文件具有可逆性,就是可以通过解压缩的方法恢复原来的数据,通常对文本文件,字处理文件,应用程序等采用这种算法。有损压缩算法在压缩时回丢失一些信息,压缩后不能完整恢复出原有信息,较多应用于音频,视频图象数据的处理。1.原程序2.编码3.译出的文件五、总结1静态哈夫曼编码方法有一些缺点:对于过短的文件进行编码的意义不大,因为光以4BYTES的长度存储哈夫曼树的信息就需1024Bytes的存储空间;2对较大的文件进行编码时,频繁的磁盘读写访问会降低数据编码的速度。经过网上查询已经有了改进之法-动态的哈夫曼编码方法。动态哈夫曼编码使用一棵动

8、态变化的哈夫曼树,对第t+1 个字符的编码是根据原始数据中前 t个字符得到的哈夫曼树来进行的,编码和解码使用相同的初始哈夫曼树,每处理完一个字符,编码和解码使用相同的方法修改哈夫曼树,所以没有必要为解码而保存哈夫曼树的信息。编码和解码一个字符所需的时间与该字符的编码长度成正比,所以动态哈夫曼编码可实时进行。动态哈夫曼编码比静态哈夫曼编码复杂的多;3哈夫曼树是哈夫曼编码的应用,也是编码和译码的核心,是连接编码和译码的纽带。该压缩软件采用的正是哈夫曼算法,建立哈夫曼树,对原文件中的字符进行哈夫曼编码,通过将哈夫曼算法应用与压缩软件,更进一步理解哈夫曼树的建立和对各个叶子结点的编码。哈夫曼压缩技术对

9、文本文件压缩效率很高,对于 2 进制文件这种方法也很成功,但压缩比没有那么显著;4编码不是唯一的,但用你的代码算出来的是唯一的,所以传输一定要用自己的代码解码,构造好哈夫曼树后,就可根据哈夫曼树进行编码。例如:字符根据其出现的概率作为权值构造一棵哈夫曼树后,经哈夫曼编码得到的对应的码值。只要使用同一棵哈夫曼树,就可把编码还原成原来那组字符;5该程序中因为涉及文件操作,多次读写文件,为了保证操作后的文件与原文件的一致性,在打开或者建立新文件时都是以二进制进行操作,着不仅加深了我们对文件操作的理解,也在程序中体现了完整性,并且将解压后的文件和原文件相比较具有一致性,体现的程序的健壮性。六、参考文献数据结构C 程序设计

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 工作总结

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报