数据结构-哈夫曼编码实验报告.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 哈夫曼 编码 实验 报告
- 资源描述:
-
实验报告 实验课名称:数据结构实验 实验名称:文件压缩问题 班级:20132012 学号: 姓名: 时间:2015-6-9 一、问题描述 哈夫曼编码就是一种常用得数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件得传输长度,提高信道利用率及传输效率.要求采用哈夫曼编码原理,统计文本文件中字符出现得词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件得目得,再用哈夫曼编码进行译码解压缩。 二、数据结构设计 首先定义一个结构体: struct head { unsigned char b; //记录字符 long count; //权重 int parent,lch,rch; //定义双亲,左孩子,右孩子 char bits[256]; //存放哈夫曼编码得数组 } header[512],tmp; //头部一要定设置至少512个,因为结点最多可达256,所有结点数最多可达511 三、算法设计 输入要压缩得文件读文件并计算字符频率根据字符得频率,利用Huffman编码思想创建Huffman树由创建得Huffman树来决定字符对应得编码,进行文件得压缩解码压缩即根据Huffman树进行译码 设计流程图如图1、1所示. 建立哈夫曼树 根据哈夫曼树解码 对二进制文件进行解码 统计字符,得出统计出字符得权值n 根据哈夫曼树编码 ﻩ 对编码进行压缩 生成哈夫曼树 生成对应文件 生成二进制文件 图1、1 设计流程图 (1)压缩文件 输入一个待压缩得文本文件名称(可带路径)如:D:\lu\lu、txt统计文本文件中各字符得个数作为权值,生成哈夫曼树;将文本文件利用哈夫曼树进行编码,生成压缩文件。压缩文件名称=文本文件名、COD 如:D:\lu\lu、COD压缩文件内容=哈夫曼树得核心内容+编码序列 for(int i=0;i<256;i++) { header[i]、count=0; //初始化权重 header[i]、b=(unsigned char)i; //初始化字符 } ifstream in); while(in()!=EOF) { in((char *)&temp,sizeof(unsigned char)); //读入一个字符 header[temp]、count++; //统计对应结点字符权重 flength++; //统计文件长度 } in(); //关闭文件 for(i=0;i<256-1;i++) //对结点进行冒泡排序,权重大得放在上面,编码时效率高 for(int j=0;j<256-1-i;j++) if(header[j]、count〈header[j+1]、count) { tmp=header[j]; header[j]=header[j+1]; header[j+1]=tmp; } for(i=0;i<256;i++) if(header[i]、count==0) break; leafnum=i; //取得哈夫曼树中叶子结点数 pointnum=2*leafnum—1; //取得哈夫曼树中总结点数目 in(in); //打开待压缩得文件 in(); in(0); ofstream out); //打开压缩后将生成得文件 out((char *)&flength,sizeof(long)); //写入原文件长度 (2)哈夫曼编码 for(i=0;i<leafnum;i++) { out((char *)&header[i]、b,sizeof(unsigned char)); //写入字符 header[i]、count=strlen(header[i]、bits); //不再设置其她变量,权值这时已无使用价值,可以用相应结点得权值变量记录长度 out((char *)&header[i]、count,sizeof(unsigned char)); //写入长度得ASCII码 if(header[i]、count%8==0) bytelen=header[i]、count/8; else { bytelen=header[i]、count/8+1; strcat(header[i]、bits,”0000000”); //在编码后面补0,使其最后凑满8得倍数, //超过无妨,可以用bytelen控制好写入字节得长度 } for(int j=0;j<bytelen;j++) { temp=ctoa(header[i]、bits); out((char *)&temp,sizeof(unsigned char)); strcpy(header[i]、bits,header[i]、bits+8); cout<〈"该文件得哈夫曼得编码为:"〈<endl; for(i=0;i<flength;i++) { cout<<header[i]、bits〈<endl; ﻩ } } } //此循环结束后就完成了编码对照表得写入 (3) 解压文件 输入一个待解压得压缩文件名称(可带路径 )如:D:\lu\lu、COD从文件中读出哈夫曼树,并利用哈夫曼树将编码序列解码;生成(还原)文本文件.文件文件名称=压缩文件名+”_new、txt”如:D:\lu\lu_new、txt while(1) { while(readlen<(clength-8)&&strlen(buf)<=256) //读满缓冲区 { in((char *)&temp,sizeof(temp)); ctoa(temp,code); //将字节转为数组 strcat(buf,code); readlen++; }//while while(strlen(buf)〉=256) //处理缓冲区,直到少于256位,再读满它 { for(i=0;i<strlen(buf);i++) { strcpy1(buf1,buf,i+1); //逐渐增多取,放入buf1,进行匹配 if(strcmp1(buf1,header,n,temp)==1) { out((char *)&temp,sizeof(unsigned char)); writelen++; strcpy(buf,buf+i+1); //缓冲区前移 break; } }//for if(writelen〉=flength) break; //如果写入达到原文件长度,退出 }//while if(readlen>=(clength-8)/*编码长度*/||writelen>=flength) break; //如果写入或者读入编码完毕,退出 }//退出此循环后,还有未解码完成得buf[] //对buf[]缓冲得善后处理 while(writelen〈flength) { for(i=0;i<strlen(buf);i++) { strcpy1(buf1,buf,i+1); if(strcmp1(buf1,header,n,temp)==1) { out((char *)&temp,sizeof(unsigned char)); writelen++; strcpy(buf,buf+i+1); break; } }//for } in(); //关闭文件 out(); 四、界面设计 程序包含压缩功能,解压功能,输出功能,帮助,终止程序功能。 五、运行测试与分析 (1)运行程序,显示提示,如图1、2所示。 图1、2 启动界面 (2) 编码操作. 图1、3在D盘中建立一个文本文档,并命名为123、txt 图1、4文件压缩,输出哈弗曼编码界面 图1、5在D盘中生成一个。COD得文档,并且名为12、COD: (3)解码操作。根据实验要求输出实验结果。如图1、4所示。 图1、4 数据结果输出界面 (4) 显示数据内容 若用户想知道文本输入得内容,可输入“L”, 然后界面提示输入文本文件得路径与文件名,完成输入后按回车键,界面会出现文本得内容。 六、实验收获与思考 在完成实验得过程中,使我明白了面向对象与面向对象得差别.在面向对象过程中,类得设计就是至关重要得,类设计好了等于程序就成功了一半,所以这次得课程帮助我复习了这一学期面向对象课程得学习,刚好可以弥补这一学期面向对象学习得不足。同时,也使我对数据结构与算法得知识有了一定得了解,帮我在大二学习数据结构与算法得课程中奠定了一定得基础,使我以后学习数据结构与算法得时候可以更加轻松. 教师评分: 教师签字:展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




数据结构-哈夫曼编码实验报告.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/4356967.html