数据结构实验报告-文件压缩

合集下载

数据结构(5)_文件压缩

数据结构(5)_文件压缩

数据结构实验报告实验名称:文件压缩实验类型:综合性试验班级:20112111学号:2011211107姓名:冯若航实验日期:2003.6.19 下午4:001.问题描述文件压缩①基本要求哈夫曼编码是一种常用的数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件的传输长度,提高信道利用率及传输效率。

要求采用哈夫曼编码原理,统计文本文件中字符出现的词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件的目的,再用哈夫曼编码进行译码解压缩。

●统计待压缩的文本文件中各字符的词频,以词频为权值建立哈夫曼树,并将该哈夫曼树保存到文件HufTree.dat中。

●根据哈夫曼树(保存在HufTree.dat中)对每个字符进行哈夫曼编码,并将字符编码保存到HufCode.txt文件中。

●压缩:根据哈夫曼编码,将源文件进行编码得到压缩文件CodeFile.dat。

●解压:将CodeFile.dat文件利用哈夫曼树译码解压,恢复为源文件。

2.数据结构设计此类问题,应设计文件的数据结构。

* 4 压缩头标记* 1 文件名长度* ns 文件名* 4 源文件长度* 1020 huffman树* 1021~EOF 文件内容赫夫曼树节点的数据结构typedef struct node{long w; //权short p,l,r; //父亲,左孩子,右孩子}HTNODE,*HTNP; //霍夫曼树的结点赫夫曼编码数组元素的数据结构设计typedef struct huffman_code{BYTE len; //长度BYTE *codestr; //字符串}HFCODE; //霍夫曼编码数组元素3.算法设计源代码#define_CRT_SECURE_NO_DEPRECATE#include<stdio.h>#include<string.h>#include<stdlib.h>typedef unsigned int UINT;typedef unsigned char BYTE;typedef struct node{long w; //权short p,l,r; //父亲,左孩子,右孩子}HTNODE,*HTNP; //霍夫曼树的结点typedef struct huffman_code{BYTE len; //长度BYTE *codestr; //字符串}HFCODE; //霍夫曼编码数组元素#define OK 1#define ERROR -1#define UNUSE -1 //未链接节点标志#define CHAR_BITS 8 //一个字符中的位数#define INT_BITS 32 //一个整型中的位数#define HUFCODE_SIZE 256 //霍夫曼编码个数#define BUFFERSIZE 256 //缓冲区大小大小#define UINTSIZE sizeof(UINT)#define BYTESIZE sizeof(BYTE)#define TAG_ZIGHEAD 0xFFFFFFFF //压缩文件头标#define MAX_FILENAME512//函数声明//压缩模块int Compress(char *SourceFilename,char *DestinationFilename);//压缩调用int Initializing(char *SourceFilename,FILE **inp,char *DestinationFilename,FILE **outp); //初始化文件工作环境long AnalysisFiles(FILE *in,long frequency[]);//计算每个不同字节的频率以及所有的字节数int CreateHuffmanTree(long w[],int n,HTNODE ht[]);//生成霍夫曼树int HuffmanTreeCoding(HTNP htp,int n,HFCODE hc[]);//霍夫曼编码int Search(HTNP ht,int n);//查找当前最小权值的霍夫曼树节点并置为占用BYTE Char2Bit(const BYTE chars[CHAR_BITS]);//将一个字符数组转换成二进制数字int Search(HTNP ht,int n);//查找当前最小权值的霍夫曼树节点并置为占用int WriteZipFiles(FILE *in,FILE *out,HTNP ht,HFCODE hc[],char* SourceFilename,long source_filesize);//写压缩文件//解压缩模块int DeCompress(char *SourceFilename,char *DestinationFilename);//解压缩调用int Initializing_Dezip(char *SourceFilename,FILE **inp,char*DestinationFilename,FILE **outp); //为处理解压缩流程初始化文件void ReadHuffmanTree(FILE* in,short mini_ht[][2]);//从待解压缩文件中读取huffman树int WriteDeZipFiles(FILE *in,FILE* out,short mini_ht[][2],long bits_pos,longDst_Filesize); //写解压缩文件void ErrorReport(int error_code);//报错//函数定义//函数实现//压缩int Compress(char *SourceFilename,char *DestinationFilename){FILE *in,*out; //输入输出流int i; //计数变量float Compress_rate; //存放压缩率HFCODE hc[HUFCODE_SIZE]; //存放256个字符的huffman编码HTNODE ht[HUFCODE_SIZE*2-1]; //256个字符的huffman树需要2*256-1=511个节点。

数据结构哈夫曼压缩软件设计实验报告

数据结构哈夫曼压缩软件设计实验报告

东北大学信息科学与工程学院数据结构课程设计报告题目哈夫曼压缩软件设计课题组长王健课题组成员张颖刘琪张晓雨专业名称计算机科学与技术班级计1307指导教师杨雷2015 年1月课程设计任务书目录1 课题概述 (4)1.1 课题任务 (4)1.2 课题原理 (4)1.3 相关知识 (4)2 需求分析 (5)2.1 课题调研 (5)2.2 用户需求分析 (5)3 方案设计 (5)3.1 总体功能设计 (5)3.2 数据结构设计 (6)3.3 函数原型设计 (6)3.4 主算法设计 (7)3.5 用户界面设计 (9)4 方案实现 (12)4.1 开发环境与工具 (12)4.2 程序设计关键技术 (12)4.3 个人设计实现(按组员分工)4.3.1 王健设计实现 (12)4.3.2 张颖设计实现 (17)4.3.3 刘琪设计实现 (20)4.3.4 张晓雨设计实现 (22)5 测试与调试 (25)5.1 个人测试(按组员分工) (25)5.1.1 王健测试 (25)5.1.2 张颖测试 (26)5.1.3 刘琪测试 (27)5.1.4 张晓雨测试 (31)5.2 组装与系统测试 (32)5.3 系统运行 (32)6 课题总结 (33)6.1 课题评价 (33)6.2 团队协作 (33)6.3 下一步工作 (33)6.4 个人设计小结(按组员分工) (33)6.4.1 王健设计小结 (33)6.4.2 张颖设计小结 (34)6.4.3 刘琪设计小结 (34)6.4.4 张晓雨设计小结 (34)7 附录A 课题任务分工 (35)A-1 课题程序设计分工 (35)A-2 课题报告分工 (36)附录B 课题设计文档(光盘) (37)B-1源程序代码(*.H,*.CPP) (37)B-2工程与可执行文件) (37)附录C 用户操作手册(可选) (37)C.1 运行环境说明 (37)C.2 操作说明 (37)1 课题概述1.1课题任务采用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。

哈夫曼压缩解压-数据结构设计报告

哈夫曼压缩解压-数据结构设计报告

《数据结构》课程设计数学与应用数学一班胡耕岩 2012214147一、问题分析和任务定义1.1设计任务采用哈夫曼编码思想实现文件的压缩和恢复功能,并提供压缩前后的占用空间之比。

要求(1)运行时的压缩原文件的规模应不小于5K。

(2)提供恢复文件与原文件的相同性对比功能。

1.2问题分析本课题是利用哈夫曼编码思想,设计对一个文本文件(.txt)中的字符进行哈夫曼编码,生成编码压缩文件,并且还可将一个压缩后的文件进行解码还原为原始文本文件(.txt)。

在了解哈夫曼压缩解压缩原理之前,首先让我们来认识哈夫曼树。

哈夫曼树又称最优二叉树,是带权路径长度最小的二叉树。

在文本文件中多采用二进制编码。

为了使文件尽可能的缩短,可以对文件中每个字符出现的次数进行统计。

设法让出现次数多的字符二进制码短些,而让那些很少出现的字符二进制码长一些。

若对字符集进行不等长编码,则要求字符集中任一字符的编码都不是其它字符编码的前缀。

为了确保哈夫曼编码的唯一性,我们可以对它的左右子树的大小给予比较限定,如:左子树的权值小于右子树的权值。

哈夫曼树中的左右分支各代表‘0’和‘1’,则从根节点到叶子节点所经历的路径分支的‘0’和‘1’组成的字符串,为该节点对应字符的哈夫曼编码。

统计字符中每个字符在文件中出现的平均概率(概率越大,要求编码越短)。

利用哈夫曼树的特点:权越大的叶子离根越近,将每个字符的概率值作为权值,构造哈夫曼树。

则概率越大的节点,路径越短。

哈夫曼译码是从二进制序列的头部开始,顺序匹配成共的部分替换成相应的字符,直至二进制转换为字符序列。

哈夫曼用于文件解压缩的基础是在压缩二进制代码的同时还必须存储相应的编码,这样就可以根据存储的哈夫曼编码对压缩代码进行压缩。

总之,该课题的任务应该是首先要打开要压缩的文本文件并读出其字符出现的频率,以其为权值构建哈夫曼树。

其次要找到构建压缩功能的方法,在构建哈夫曼树的基础上进行编码,改变字符原先的存储结构,以达到压缩文件的目的,以外还有存储相应的哈夫曼编码,为解压缩做准备。

压缩实验报告数据分析

压缩实验报告数据分析

一、实验背景压缩实验是一种常见的力学实验,通过在特定的实验条件下对材料进行压缩,研究其力学性能。

本次实验主要针对某一种材料进行压缩实验,以了解其压缩性能。

本报告将对实验数据进行详细分析,得出实验结果。

二、实验目的1. 研究材料在不同压力下的变形情况;2. 了解材料的弹性模量和屈服强度;3. 分析材料在不同压力下的力学性能。

三、实验原理压缩实验通常采用单轴压缩实验,即在轴向施加压力,使材料发生压缩变形。

根据胡克定律,材料的应力与应变之间存在线性关系,即应力=弹性模量×应变。

当材料达到屈服强度时,应力与应变之间的关系将不再线性,此时材料将发生塑性变形。

四、实验方法1. 实验材料:选取某一种材料作为实验对象;2. 实验设备:压缩试验机;3. 实验步骤:(1)将实验材料切割成规定尺寸;(2)将材料放置在压缩试验机上;(3)对材料施加轴向压力,记录材料在不同压力下的变形情况;(4)根据实验数据,绘制应力-应变曲线;(5)分析材料的力学性能。

五、实验数据及分析1. 实验数据表1:实验数据压力(MPa)应变(%)应力(MPa)0 0 010 0.5 2020 1.0 4030 1.5 6040 2.0 8050 2.5 1002. 数据分析(1)线性阶段:从表1中可以看出,在压力0-30MPa范围内,材料的应力与应变呈线性关系,弹性模量E=40MPa。

这说明材料在该压力范围内具有良好的弹性性能。

(2)非线性阶段:当压力超过30MPa时,应力与应变之间的关系不再线性,材料开始发生塑性变形。

此时,材料的屈服强度约为100MPa。

(3)应力-应变曲线:根据实验数据,绘制应力-应变曲线,如图1所示。

曲线在压力0-30MPa范围内呈线性,压力超过30MPa后,曲线出现拐点,表明材料开始发生塑性变形。

图1:应力-应变曲线(4)力学性能分析:根据实验数据,该材料在压力0-30MPa范围内具有良好的弹性性能,弹性模量为40MPa;当压力超过30MPa时,材料开始发生塑性变形,屈服强度约为100MPa。

数据结构-哈夫曼编码压缩解压缩设计报告

数据结构-哈夫曼编码压缩解压缩设计报告

;} 数个的0的充填时个8满不tib的中etyb后最到缩压// ;munkcal tni 数个的tib中etyb// ;munstib tni 量变的tib冲缓来用时件文缩压// ;etyb rahc 1-2*fael过超会不数个 点结大最的树 �树namffuh示表来用 �组数的构结edonTH// ;]1-2*fael[TH edonTH 数个的符字同不录记// ;munfael tni 置位的点结根录记// ;toor tni :etavirp 较比件文的后复恢与件文原将// ;)tuptuo* rahc ,tupni* rahc(2erapmoc diov 较比件文的后缩压与件文原将// ;)tuptuo* rahc ,tupni* rahc (erapmoc diov eslaf败失 eurt 回返功成,数函复恢// ;)tuptuo* rahc ,tupni* rahc (sserpmoced loob eslaf 败失 eurt 回返功成,数函缩压// ;)tuptuo* rahc ,tupni* rahc(sserpmoc loob 空清etyb将// ;)(etybteser diov tib个一入加中etyb的tib个8满未个一对时缩压// ;)tib tni (tibdda diov 码编namffuh的符字个每出列// ;)(edoctnirp diov 码编namffuh的符字个每算计树namffuh用利时缩压// ;)(edoc diov
树namffuh 造构值权的点结各据根时缩压// ;)(etaerc diov 值权的点结应对入写其将�数次的现出符字各计统时缩压// ;)tupni* rahc(tnuoc loob ;)(eerTnamffuh~ lautriv ;)(eerTnamffuh :cilbup { eerTnamffuh ssalc ;edonTH} } ;0 = neledoc ;1- = dlihcr ;1- = dlihcl ;1- = tnerap ;XAM = thgiew { )(edonTH 子孩右左及亲双无�大穷无为值权其令�点结化始初// 度长的码编namffuh点结该录记// ;neledoc tni 码编namffuh的点结该录记// ;edoc* tni 子孩右的点结// ;dlihcr tni 子孩左的点结/ ;dlihcl tni 置位点结亲双的点结录记// ;tnerap tni 值权的点结录记// ;th giew gnol { edonTH tcurts fedepyt 体构结点结的树namffuh//

文件压缩程序设计报告

文件压缩程序设计报告

课程设计报告课程名称:操作系统实验题目:文件压缩程序院系:计算机科学与工程学院班级:姓名:学号:二○一一年七月一日一、需求分析:有两种形式的重复存在于计算机数据中,文件压缩程序就是对这两种重复进行了压缩。

一种是短语形式的重复,即三个字节以上的重复,对于这种重复,压缩程序用两个数字:1.重复位置距当前压缩位置的距离;2.重复的长度,来表示这个重复,假设这两个数字各占一个字节,于是数据便得到了压缩。

第二种重复为单字节的重复,一个字节只有256种可能的取值,所以这种重复是必然的。

给 256 种字节取值重新编码,使出现较多的字节使用较短的编码,出现较少的字节使用较长的编码,这样一来,变短的字节相对于变长的字节更多,文件的总长度就会减少,并且,字节使用比例越不均匀,压缩比例就越大。

编码式压缩必须在短语式压缩之后进行,因为编码式压缩后,原先八位二进制值的字节就被破坏了,这样文件中短语式重复的倾向也会被破坏(除非先进行解码)。

另外,短语式压缩后的结果:那些剩下的未被匹配的单、双字节和得到匹配的距离、长度值仍然具有取值分布不均匀性,因此,两种压缩方式的顺序不能变。

本程序设计只做了编码式压缩,采用Huffman编码进行压缩和解压缩。

Huffman编码是一种可变长编码方式,是二叉树的一种特殊转化形式。

编码的原理是:将使用次数多的代码转换成长度较短的代码,而使用次数少的可以使用较长的编码,并且保持编码的唯一可解性。

根据 ascii 码文件中各 ascii 字符出现的频率情况创建 Huffman 树,再将各字符对应的哈夫曼编码写入文件中。

同时,亦可根据对应的哈夫曼树,将哈夫曼编码文件解压成字符文件.二、概要设计:主程序流程图:压缩过程的实现:压缩过程的流程是清晰而简单的:1. 创建Huffman 树2. 打开需压缩文件3. 将需压缩文件中的每个ascii 码对应的huffman 编码按bit 单位输出生成压缩文件压缩结束。

数据结构实验报告利用Huffman编码对文件进行压缩解压

数据结构实验报告利用Huffman编码对文件进行压缩解压

《数据结构》实验报告利用Huffman编码对文件进行压缩解压学生:XXX学号:XXXXXXXX联系:XXXXXX@(一)基本信息1.实验题目利用Huffman编码对文件进行压缩解压2.完成人(姓名、学号)姓名:XXX 学号:XXXXXXXX3.报告日期2007年12月12日星期二(二)实习内容简要描述1.实习目标学会对树的基本操作学会对文件进行操作利用Huffman编码对文件压缩解压2.实习要求实现最小堆模板类利用最小堆构建Huffman树实现Huffman编码和解码根据用户从键盘输入的报文文本,输出各字符的Huffman编码以及报文的编码根据用户从键盘输入一串报文文本,输出各字符的Huffman编码输出报文的Huffman编码及长度根据输入的Huffman编码,解码输出利用Huffman编码和解码对二进制文件的压缩和解压(三)报告主要内容1.设计思路开发环境:Microsoft Visual C++ 2005设计思路:1.设计Pack类储存字符的权值2.设计MinHeap模板类构建最小堆3.设计ExtBinTree模板类为带权二叉树4.设计Compress模板类以实现文件的压缩解压2.主要数据结构1.MinHeap.h: 头文件,包含MinHeap模板类的类界面以及定义;2.HuffmanTree.h:头文件,包含ExtBinTree模板类以及Compress模板类的类的的类界面以及定义3.main.cpp:调用上述头文件实现相关操作3.主要代码结构主要代码结构为见附件中各文件的代码注释4.主要代码段分析主要代码段分析,见附件中的代码注释(四)实习结果1.基本数据源程序代码行数:约800行完成该实习投入的时间:二十四小时(不包括写实验报告的时间)与其他同学讨论交流情况:感谢刘畅同学对程序的测试2.测试数据设计1.对屏幕输入字符进行Huffman编码2.根据Huffman树非唯一性,虽然和课件上有些许不同,但是还是正确的3.输入字符串:CASTCASTSATATATASA4.输出编码:A:0 C:110 S:111 T:105.输入霍夫曼编码:01110101101106.输出译码:ASATCC7.8.对”实验05.PPT”的压缩操作9.使用0秒(不足一秒按0秒计算),压缩率为56.1755%10.对”实验05.ppt.hfm”(即刚才生成的压缩文件)的解压操作11.使用0秒(不足一秒按0秒计算),解压后文件无异常12.对一个18M的EXE安装包前后进行压缩和解压操作,分别用时10秒和9秒3.测试结果分析A)程序运行的系统资源配置操作系统:Microsoft Windows XP Professional SP2CPU: AMD Athlon 3600+ 2.0GRAM: 1024M DDRII开发环境:Microsoft Visual C++ 2005B)对TXT文档进行压缩和解压后,通过WinMerge检验和原文件无差异C)对MP3和EXE文件压缩和解压后仍能正常使用D)对于中文名字和带有空格的路径均能正确无误识别E)文件名只能小于16个字符(包括后缀名),否则解压会出错(只预留了16个字节用于储存文件名)F)相对于不用文件块读写的程序,效率提高了三倍以上G)具有动态进度条,可以显示当前压缩和解压的进度百分比(当然消耗了一些系统资源)H)出错处理不够充分,特别是cin部分,如果误输入可能会造成死循环(五)实习体会1.实习过程中遇到问题及解决过程A)一开始时候的程序运行很慢,,压缩一个4M左右的文件需要七八秒,后来改用文件块缓存字节来读写后,压缩一个4M的文件只需要两秒左右的时间.本来是只想写一个进度条而已的,后来发现如果只读一个字节就判断一次进度条的话会很消耗系统资源,后来干脆麻烦点用文件块来缓存.不过至于一次缓存多少字节才能达到最好的效果还未知,现在设置的是一次缓存40KB 的数据B)本来一个一个字节读的时候对最后一个字节的操作基本没费什么劲,但是在文件块读写的时候就不是那么清晰明了了,后来经过仔细Debug,才找到错误的所在.许多问题都是这样C)对于中文名和带空格路径,用C++的fstream就不支持,但是C中的FILE*就支持,不知道为什么.还有C++中的fstream的成员函数read返回值很奇怪,不知道如何获取成功读入的项数.改用C中的FILE*文件指针后就解决掉了D)由于这次实验的各个步骤是一环套一环的,在哪里出错很难找得出来,所以这次实验调试消耗的时间特别多.最郁闷的一次错误是发现在取得字符C的第N位函数中,居然把0x40写成了0x30.有时候文件解压出来不对,但是又不清楚是压缩时候错了,还是解压时候错了,然后就要两个函数都要检查一遍.2. 实习体会和收获这次实验最大的特点在于难找错,很锻炼自己的Debug能力(六)自评成绩分数:90 //功能做得较齐全,程序的效率也不错(七)参考文献MSDN还有某网站上树的遍历算法(八)源程序见同一文件夹内.。

LZSS压缩算法实验报告

LZSS压缩算法实验报告

LZSS压缩算法实验报告一、引言LZSS是一种常用的压缩算法,被广泛应用于数据压缩领域。

它的核心思想是通过利用数据中存在的重复信息来实现压缩。

本实验主要对LZSS压缩算法进行研究与实验,评估其压缩效果和性能。

二、算法原理LZSS算法是一种基于滑动窗口和查找缓冲区的字典算法。

其主要思想是将输入数据分为两个部分:滑动窗口和查找缓冲区。

滑动窗口维护了最长匹配的前缀字符串,而查找缓冲区则用来寻找重复的字符串。

具体实现步骤如下:1.初始化滑动窗口和查找缓冲区;2.在滑动窗口中寻找与查找缓冲区中最长匹配的字符串;3.若找到匹配字符串,则将其标记为索引和长度的形式;4.若未找到匹配字符串,则将当前字符输出;5.更新滑动窗口和查找缓冲区;6.重复2-5步骤,直到所有字符处理完毕。

三、实验设计本实验的主要目的是评估LZSS压缩算法的压缩效果和性能表现。

为了完成实验,我们设计了以下实验流程:1.实现LZSS压缩和解压缩算法;2.准备不同类型和大小的文件,用于测试压缩算法的效果;3.运行压缩算法,并记录压缩比、压缩时间和解压缩时间;4.对比不同类型和大小的文件的压缩比和压缩时间;5.分析实验结果并给出评估。

四、实验结果与分析我们分别对文本文件、图像文件和音频文件进行了压缩实验。

实验结果如下:1.文本文件压缩实验结果:压缩比为70%,压缩时间为0.5秒,解压缩时间为0.3秒。

2.图像文件压缩实验结果:压缩比为80%,压缩时间为1秒,解压缩时间为0.6秒。

3.音频文件压缩实验结果:压缩比为60%,压缩时间为0.8秒,解压缩时间为0.4秒。

从实验结果可以看出,不同类型的文件对LZSS压缩算法的效果存在差异。

文本文件由于存在大量的重复信息,所以可以获得较高的压缩比。

而图像文件和音频文件的压缩比较低,因为它们的数据特征较为复杂,存在较少的重复信息。

压缩时间和解压缩时间较短,说明LZSS压缩算法具有较好的性能表现。

五、总结本实验通过对LZSS压缩算法的实验研究,评估了其压缩效果和性能表现。

哈夫曼文件压缩实验报告

哈夫曼文件压缩实验报告

数据结构实验报告三——哈夫曼文件压缩实验题目:哈夫曼文件压缩实验目标:输入一个有10k单词的英文文档。

输出压缩后的二进制文件,并计算压缩比。

数据结构:栈和哈夫曼树。

1.定义栈()typedef struct{char *elem;int stacksize;int top;}STACK;2.定义哈夫曼树()typedef struct{int weight;int left,right;int parent;}HTNode;需要的操作有:1.初始化栈(Initstack)void Initstack(STACK *s){s->elem=(char *)malloc(sizeof(int)*1000);s->stacksize=1000;s->top=-1;}2.压栈(push)void push(STACK *s,int e){s->elem[++s->top]=e;}3.弹栈(pop)void pop(STACK *s,int *e){if(s->top!=-1)*e=s->elem[s->top--];}4.构造哈夫曼树(Inithuffman)void Inithuffman(int wset[n],int k,HuffTree HT[]){ //构造哈夫曼树int i,m;int s1,s2;m=k*2-1;for(i=0;i<m;i++){ //初始化HT数组HT[i]=(HuffTree)malloc(sizeof(HTNode));HT[i]->weight=(i<k?wset[i]:0);HT[i]->parent=-1;HT[i]->left=HT[i]->right=-1;}for(i=k;i<m;i++){ //主循环,完成n-1次合并select(HT,k,i,&s1,&s2); //在HT[1...i-1]中选择parent为0且weight为最小的两个结点,其下标分别为s1和s2HT[i]->left=s1;HT[i]->right=s2;HT[i]->weight=HT[s1]->weight+HT[s2]->weight;HT[s1]->parent=HT[s2]->parent=i;}}其中用到另一个基本操作:找到哈夫曼树中最小和次小的结点(select)5.找到哈夫曼树中最小和次小的结点(select)void select(HuffTree HT[255],int a,int i,int *p,int *q){int j=0,k=0,*HT1,temp;HT1=(int *)malloc(sizeof(int)*(i-1)); //存放权值for(j=0;j<i;j++){if(HT[j]->parent==-1){HT1[k]=HT[j]->weight; //把没有parent的结点的权值放在HT1中k++;}//printf("%4d%4d%4d%4d%4d\n",HT[j]->parent,HT[j]->left,HT[j]->right,HT[j]->we ight,HT1[k-1]);}j=0;while(j<2) { //找到权值最小和第二小的结点for(k=j;k<(i-(i-a)*2);k++){if(HT1[j]>HT1[k]){temp=HT1[k];HT1[k]=HT1[j];HT1[j]=temp;}}j++;}k=0;for(j=0;j<i;){if(HT[j]->parent==-1)if(HT[j]->weight==HT1[0]&&k<1){ //将最小的权值赋到*p中*p=j;k++;}j++;}for(j=0;j<i;){if(HT[j]->parent==-1)if(j!=*p)if(HT[j]->weight==HT1[1]&&k<2){ //将第二小的权值赋到*q 中*q=j;k++;}j++;//printf("%4d%4d%4d%4d\n",HT[i]->parent,HT[i]->left,HT[i]->right,HT[i]->weigh t);}}6.根据哈夫曼树得到各字符对应的哈夫曼编码(Huffman)void Huffman(HuffTree HT[2*n-1],int k,char str[][20]){int i,j,e,t1=0,t2=0;char c;STACK st;for(i=0;i<k;i++){if(HT[i]->right==-1&&HT[i]->left==-1){ //找一个叶子结点Initstack(&st);HT[i]->right=HT[i]->left==-2;j=i; //记录其下标while(HT[j]->parent!=-1){if(HT[HT[j]->parent]->right==j) //找到一个叶子结点,如果他是其parent结点的右结点,就将此边记为1push(&st,'1');elsepush(&st,'0'); //在左边记为0j=HT[j]->parent; //循环操作直到到达根结点}c=i;printf("\t%c ",c); //打印此字符for(;st.top!=-1;){pop(&st,&e);printf("%c",e); //打印其二进制编码str[t1][t2]=e; //将二进制编码存放在str中t2++;}putchar('\n');str[t1][t2]='\0';t2=0;t1++;}}}算法设计:1.从文件中逐个读取字符,记录其出现次数以及文件总字符数,由此确定其频率高低。

【数据结构】哈夫曼压缩软件设计_实验报告

【数据结构】哈夫曼压缩软件设计_实验报告

东北大学信息科学与工程学院数据结构课程设计报告题目哈夫曼压缩软件设计课题组长王健课题组成员张颖刘琪张晓雨专业名称计算机科学与技术班级计1307指导教师杨雷2015 年1月课程设计任务书目录1 课题概述 (4)1.1 课题任务 (4)1.2 课题原理 (4)1.3 相关知识 (4)2 需求分析 (5)2.1 课题调研 (5)2.2 用户需求分析 (5)3 方案设计 (5)3.1 总体功能设计 (5)3.2 数据结构设计 (6)3.3 函数原型设计 (6)3.4 主算法设计 (7)3.5 用户界面设计 (9)4 方案实现 (12)4.1 开发环境与工具 (12)4.2 程序设计关键技术 (12)4.3 个人设计实现(按组员分工)4.3.1 王健设计实现 (12)4.3.2 张颖设计实现 (17)4.3.3 刘琪设计实现 (20)4.3.4 张晓雨设计实现 (22)5 测试与调试 (25)5.1 个人测试(按组员分工) (25)5.1.1 王健测试 (25)5.1.2 张颖测试 (26)5.1.3 刘琪测试 (27)5.1.4 张晓雨测试 (31)5.2 组装与系统测试 (32)5.3 系统运行 (32)6 课题总结 (33)6.1 课题评价 (33)6.2 团队协作 (33)6.3 下一步工作 (33)6.4 个人设计小结(按组员分工) (33)6.4.1 王健设计小结 (33)6.4.2 张颖设计小结 (34)6.4.3 刘琪设计小结 (34)6.4.4 张晓雨设计小结 (34)7 附录A 课题任务分工 (35)A-1 课题程序设计分工 (35)A-2 课题报告分工 (36)附录B 课题设计文档(光盘) (37)B-1源程序代码(*.H,*.CPP) (37)B-2工程与可执行文件) (37)附录C 用户操作手册(可选) (37)C.1 运行环境说明 (37)C.2 操作说明 (37)1 课题概述1.1课题任务采用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。

压缩解压缩实验报告

压缩解压缩实验报告

实验报告班级0901101 学号PB09210173 姓名饶亚民日期2010-11-10 一、题目要求:利用Huffman树及其编码原理写一个压缩和解压缩程序二、概要设计根据对用户输入的内容判断用户是要求压缩还是解压缩,若是压缩,则读入需压缩的文件(以二进制形式打开),求文件中字符的权重,构建Huffman树,求每个字符的Huffman编码,然后依次读入需压缩文件的内容,把其每个字符用其Huffman编码代换存入一数组中,输出到输出文件中。

输出文件格式为--.zap(也是二进制形式输出)。

若是解压缩,则根据读入文件的内容(以二进制形式打开),先判断是否为本压缩程序所压缩,若非,则报错。

若是,则依次读入存入该文件中的原来压缩文件的后缀名,原来文件中每个字符的权重,然后依据已存的每个字符的权重构建Huffman树,接着求每个字符的Huffman编码。

然后依次读入文件中的已存的以Huffman编码结果储存的0和1字符,按照Huffman编码结果,左子树为0,右子树为1,直至叶子节点,然后就可得到该Huffman编码所存储的字符值,然后依次输出到输出文件中,其中有一个count,用来记录已输出的字符个数,当它等于被压缩的文件长度时就停止。

三、详细设计详细数据结构定义:#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<string.h>#include"head.cpp"#include"BitWriting-Reading.cpp"#include"Directions.cpp"#include"Compress.cpp"#include"FindName.cpp"#include"filecompress.cpp"#include"Huffman Code.cpp"#include"DeCompress.cpp"#include"Match.cpp"#define TRUE 1#define FALSE 0#define ERROR 0#define OK 1typedef int Status;typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char **HuffmanCode;具体实现过程:main(int argc,char *argv[])//若argc=1则按报错处理然后调用Match函数Match(argv[1],flag),其作用是用来判断用户输入的内容Status Match(char *argv,int &flag){char *parameters[]={"compress","decompress","help"};int i;for(i=0;i<3;++i){if(!strcmp(parameters[i],argv)){flag=i+1;return OK;}}flag=0;return OK;}若flag=0,则按报错处理,并提示用户可以参考’help’;若flag=1,则说明是要压缩,接着判断argv[2]是否为空,若不为空,则将其视为输出文件的文件名,若为空,则默认为输入文件名为输出文件名,仅后缀不同而已。

文件压缩与解压实验报告

文件压缩与解压实验报告

7
学生姓名
学号
专业
年级、班级
课程名称
实验 3
实验时间

实验指导老师
实验项目


实验评分
文本解压与压缩
CP3Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CRect rect; GetClientRect(rect);///取得客户区域 pDC-> FillRect(rect,&m_brushBackground); ///用背景画刷填充区域 OnEraseBkgnd(pDC); CPen penblack;//定义画笔 CBrush brush1;//定义画刷 COLORREF oldbackcolor=RGB(255,255,255);//获取背景颜色 penblack.CreatePen(PS_SOLID,2,RGB(255,0,0));//为 画 笔 设 定 大 小 和 颜 色 pDC->SelectObject(&penblack); brush1.CreateSolidBrush(oldbackcolor);//为画刷设定颜色 pDC->SelectObject(&brush1); if(printtree==1)//如果显示树的按钮已被按下,则执行下面的内容 {
//功能:生成哈弗曼树,为每一个哈弗曼结点生成哈弗曼编码
//函数参数:int w[]引入各个字符的权值
//
int n 字符集大小
void HaffTree::Haffman(int w[],int n)
{
int i,j,m1,m2,x1,x2;//m1,m2 表示最小、次小 x1,x2 表示左右孩子

综合实验报告格式--哈弗曼树--数据结构

综合实验报告格式--哈弗曼树--数据结构

《用哈夫曼编码实现文件压缩》实验报告课程名称《数据结构B》实验学期2014至2014 学年第 1 学期学生所在系部计算机系年级2010 专业班级网络B10-3学生姓名学号任课教师实验成绩用哈夫曼编码实现文件压缩1、了解文件的概念。

2、掌握线性链表的插入、删除等算法。

3、掌握Huffman树的概念及构造方法。

4、掌握二叉树的存储结构及遍历算法。

5、利用Huffman树及Huffman编码,掌握实现文件压缩的一般原理。

微型计算机、Windows 系列操作系统、Visual C++6.0软件根据ASCII码文件中各ASCII字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。

在文件存储时,一个整型的字符要占用一个字节的空间,对于某些不常用的字符这样会造成空间的浪费,但如果用位来存储数据,可以将字符重新编码,使那些常用的字符存储空间相对短的,不常用的字符相对长些,可以节约空间。

哈夫曼编码即是这样一个过程。

用哈夫曼编码进行文件压缩,首先应对所用的字符进行哈夫曼变编码,在这之前应先对所用字符进行权值统计。

在编码哈夫曼树的时候,选取两个权值最小的依次构造哈夫曼树,进行哈夫曼编码时,使哈夫曼树的左孩子上的分支编码为0,右孩子上的分支编码为1。

然后对文件进行压缩。

压缩过程用到了文件的读写。

头文件的构造:头文件首先应用宏定义,对文件要用到的数据进行定义,然后定义了结构体类型,将所要到字符的权值,数据,双亲编号与孩子编号放在结构体中,使程序间的关系变得紧密。

定义第二个结构体,其中包含结构体数组和树根的编号。

定义指针,使其指向第二个结构体。

接着类型定义,定义了结构体,其中包含字符原码值,哈夫曼编码值和哈夫曼编码值的长度,并将其取名为HaffCode。

将程序所用到的函数包含在头文件里。

哈夫曼树的构造:在程序开头先对程序所用到的变量进行定义,包括指向结构体的指针,整型变量,权值最小的结点的编号,第二小的结点的编号,权值最小的结点的权值,第二小的结点的权值。

数据结构阿夫曼综合报告

数据结构阿夫曼综合报告

《用哈夫曼编码实现文件压缩》实验报告班级:计算B111学号:201109014129姓名:张小梅指导教师:丁智斌实验日期:2013.6.12成绩:一、实验题目:用哈夫曼编码实现文件压缩二、实验目的:1.了解文件的概念。

2.掌握线性链表的插入、删除等算法。

3.掌握Huffman树的概念及构造方法。

4.掌握二叉树的存储结构及遍历算法。

5.利用Huffman树及Huffman编码,掌握实现文件压缩的一般原理。

三、实验设备与环境:微型计算机、Windows 系列操作系统、Visual C++6.0软件四、实验内容:根据ascii码文件中各ascii字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。

五、概要设计:本次实验采用将字符用长度尽可能短的二进制数位表示的方法,即对于文件中出现的字符,无须全部都用8位的ASCII码进行存储,根据他们在文件中出现的频率不同,我们利用Haffman算法使每个字符能以最短的二进制字符进行存储,以达到节省存储空间,压缩文件的目的。

解决了压缩需采用的算法,程序的思路已然清晰:1.统计需压缩文件中每个字符出现的频率。

2.将每个字符的出现频率作为叶子结点构建Haffman树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子的路径上得到的0、1序列,这样便完成了Haffman编码,将每个字符用最短的二进制字符表示。

3.打开需压缩文件,再将需压缩文件中的每个ASCII码对应的Haffman编码按bit单位输出。

4.文件压缩结束。

六、详细设计:1. 构造Hufffman树的方法—Hafffman算法构造Huffman树步骤:I. 根据给定的n个权值{w1,w2,⋯⋯wn},构造n棵只有根结点的二叉树,令起权值为wj。

II. 在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。

数据结构中的压缩与解压缩算法

数据结构中的压缩与解压缩算法

数据结构中的压缩与解压缩算法在数据结构中,压缩与解压缩算法扮演着重要的角色。

它们可以显著减少数据存储和传输所需的空间和时间。

压缩算法使用各种技术来减少数据的大小,而解压缩算法则将压缩的数据还原到其原始状态。

本文将介绍几种常用的压缩与解压缩算法,并讨论它们的原理和应用。

一、哈夫曼编码哈夫曼编码是一种基于变长编码的压缩算法。

它通过根据输入数据中字符的频率来构建一棵哈夫曼树,并生成一个独特的编码表。

在哈夫曼编码中,频率较高的字符用较短的编码表示,而频率较低的字符用较长的编码表示。

这种编码方式可以大大减少数据的大小,并且可以在解压缩时快速还原原始数据。

二、LZW压缩LZW(Lempel-Ziv-Welch)压缩算法是一种基于字典的压缩算法。

它通过在压缩和解压缩过程中动态构建和更新字典,将输入数据中的字符串替换为对应的索引。

LZW压缩算法能够在保持数据质量的同时实现很高的压缩比。

它被广泛应用于图像、音频和视频等多媒体数据的压缩。

三、Run-Length编码Run-Length编码是一种简单但有效的压缩算法。

它通过将连续重复的字符或数据序列替换为一个标记和一个计数值来实现压缩。

例如,连续出现的字符 "AAAABBBCCD" 可以被编码为 "4A3B2C1D"。

Run-Length编码在处理包含大量连续重复数据的情况下非常有效,但对于非重复数据的压缩效果有限。

四、Burrows-Wheeler变换Burrows-Wheeler变换是一种用于数据压缩的重排和重新排列技术。

它通过对输入数据进行循环右移和排序,生成一个新的字符串。

然后,通过记录原始字符串的最后一个字符在排序后的字符串中的位置,以及排序后的字符串中的每个字符前一个字符的索引,可以实现数据的压缩。

解压缩时,通过逆向操作将压缩后的数据还原为原始数据。

以上介绍了几种常用的压缩与解压缩算法,它们在数据结构中起着重要的作用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构与程序设计实验实验报告
哈尔滨工程大学
实验报告四
一、问题描述
哈夫曼编码是一种常用的数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件的传输长度,提高信道利用率及传输效率。

要求采用哈夫曼编码原理,统计文本文件中字符出现的词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件的目的,再用哈夫曼编码进行译码解压缩。

统计待压缩的文本文件中各字符的词频,以词频为权值建立哈夫曼树,
并将该哈夫曼树保存到文件HufTree.dat 中。

根据哈夫曼树(保存在HufTree.dat 中)对每个字符进行哈夫曼编码,并
将字符编码保存到HufCode.txt 文件中。

压缩:根据哈夫曼编码,将源文件进行编码得到压缩文件Code。

解压:将Code 文件利用哈夫曼树译码解压,恢复为源文件。

二、数据结构设计
由于哈夫曼树中没有度为1的结点,则一棵树有n个叶子结点的哈夫曼树共有2n-1个结点,可以存储在一个大小为2n-1的一维数组中,而且对每个结点而言,即需知双亲结点的信息,又需知孩子结点的信息,由此可采用如下数据结构。

1.使用结构体数组统计词频,并存储:
typedef struct Node{
int weight; //叶子结点的权值
char c; //叶子结点
int num; //叶子结点的二进制码的长度
}LeafNode[N];
2.使用结构体数组存储哈夫曼树:
typedef struct{
unsigned int weight;//权值
unsigned int parent, LChild, RChild;
}HTNode,Huffman[M+1]; //huffman树
3.使用字符指针数组存储哈夫曼编码表:
typedef char *HuffmanCode[2*M]; //haffman编码表
三、算法设计
1.读取文件,获得字符串
void read_ const *, char *ch){
FILE *in_file = Fopen(, "r");
unsigned int flag = fread(ch, sizeof(char), N, in_file);
if(flag == 0){
printf("%s读取失败\n", );
fflush(stdout);
}
printf("读入的字符串是: %s\n\n", ch);
Fclose(in_file);
int len = strlen(ch);
2.运行程序,读取文件
3.统计叶子节点的权值
4.根据权值生成哈夫曼树,保存至HufTree.dat,并用新的结构体数组读取哈夫曼树
5.HufTree.dat内容
6.根据哈夫曼树生成叶子节点的前缀码,保存至HufCode.txt,之后用新的结构体数组读取HufCode.txt
7.HufCode.txt内容
8.根据前缀码生成哈夫曼编码,保存至Code
9.Code内容
10.根据Code解压,获得原字符串,并保存至str2.txt 11.str2.txt内容
五、实验收获与思考
通过使用哈夫曼树实现文件压缩,使我充分理解哈夫曼树的构造方法以及实际应用,巩固了课堂知识,同时认识到自己的不足。

在编程中发现问题,通过查询求助解决问题,使我不断地我加深数据结构的学习。

六、附录(原程序)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100
#define M 2*N-1
typedef char *HuffmanCode[2*M];//haffman编码
typedef struct{
unsigned int weight;//权值
unsigned int parent, LChild, RChild;
}HTNode,Huffman[M+1];//huffman树
typedef struct Node{
int weight; //叶子结点的权值
char c; //叶子结点
int num; //叶子结点的二进制码的长度
}LeafNode[N];。

相关文档
最新文档