压缩程序(哈弗曼编码算法).ppt
上传人:qw****27 上传时间:2024-09-12 格式:PPT 页数:46 大小:400KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

压缩程序(哈弗曼编码算法).ppt

压缩程序(哈弗曼编码算法).ppt

预览

免费试读已结束,剩余 36 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

压缩程序(哈弗曼编码算法)需求分析概要分析采用顺序表实现对Huffman编码的存储//---------------Huffman编码存储结构------------------typedefstruct{charch;intstart;charbits[n+1];}HuffmanCode;typedefHuffmanCodeHCode[n];ch存放对应的字符,start存放Huffman编码在字符数组bits[]中开始的位置。抽象数据FilePrint(HTreeT,HCodeH,intN)初始条件:求得Huffman编码以及各节点的权值。操作结果:将求得的数据分别存放在HuffmanCode.txt、Char.txt、Weight.txt中。FileWrite(HCodeH,intN,charfilename[])初始条件:求得Huffman编码以及各节点的权值。操作结果:将文档翻译成Huffman编码以字符形式存放在File.txt中。FileConvert(void)初始条件:File.txt存在。操作结果:将字符形式的Huffman编码翻译成二进制形式,每首季8比特就通过位操作合并成一个字节写入文件code.txt中,最后不足8位时将最后的几位存放在Tail.txt中。FileRead(HTreeT,HCodeH)初始条件:压缩生成的HuffmanCode.txt、Char.txt、Weight.txt存在。操作结果:读取字符及其权值和其Huffman编码。FileExtract(void)初始条件:压缩结果文件Code.txt和tail.txt存在。操作结果:将code.txt和tail.txt中的字符写成编码的二进制字符形式,写进file00.txt。FileTrans(HTreeT,HCodeH,intN)初始条件:已生成File00,txt并已求得各个字符的Huffman编码,Huffman树已建立。操作结果:将Huffman编码翻译成原文件,写入translated.txt。}ADT还需要包含调用若干库文件:stdio.h,malloc.h,string.h。主函数采用C语言的编程方法在VC++6.0环境下实现本题目的要求。主程序流程图压缩部分由于文档限于英文文章,所以字符的ASCII码限于0~150。依次读取文档的各个字符,计算每个字符出现的次数为权值,再将数组压缩:没有出现的字符从数组中删去。返回文档出现不同字符的个数算法如下:1、统计字符出现的频率,即权值的函数intapprate(char*s,intcnt[],charstr[]);方法具体实现如下:定义两个数组,分别存放大写和小写英文字母。a.将两个数组初始化都为0.b.如果取出的字符是小写字母,则将小写字母转换为数字,每一个字符对应一个数字,同一个字符出现一次频率就加1,直到全部统计出为止,如果取出的是大写字母,方法如小写字母的实现方法。c.再将转换都的数字再转换为相应的字符,以便为下面的建树方便调用。具体代码如下:。intFileRead(intcount[],chars[],charfilename[]){inti=0,N=0,k=0,temp[n];charc;FILE*rf;rf=fopen(filename,"r");if(rf==NULL){printf("cannotopenfile\n");exit(0);}for(i=0;i<n;i++){temp[i]=0;count[i]=0;}while(!feof(rf)){c=fgetc(rf);k=c;temp[k]++;i++;}fclose(rf);for(i=0;i<n;i++){if(temp[i]!=0){s[N]=i;count[N]=temp[i];N++;}}returnN;}//FileRead三生成Huffman树函数序号序号伪代码描述为:1.数组哈夫曼树HuffmanTree初始化,所有元素结点的双亲、左右孩子都置为0;2.数组哈夫曼树HuffmanTree的前n个元素的权值给定权值cnt[n];3.进行n-1次合并c.1、在二叉树集合中选取两个权值最小的根结点,其下标分别为i1和i2;c.2、将二叉树i1和i2合并为一棵新的二叉树kvoidCreateHuffmanTree(HTreeT,intN,intcount[],chars[]){inti,j,p1=0,p2=0,l1,l2;for(i=0;i<2*N-1;i++){T[i].lchild=0;T[i].rchild=0;T[i].p