欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOCX文档下载  

    武汉理工大学数据结构与算法综合实验哈夫曼树 (1).docx

    • 资源ID:12247897       资源大小:127.90KB        全文页数:9页
    • 资源格式: DOCX        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    武汉理工大学数据结构与算法综合实验哈夫曼树 (1).docx

    .学生学号 Xxx实验课成绩学 生 实 验 报 告 书实验课程名称数据结构与算法综合实验开课学院计算机科学与技术学院指导教师姓名xxx学生姓名xxx学生专业班级xxxx2015-2016学年第2学期;.实验课程名称: 数据结构与算法综合实验 实验项目名称二叉树与赫夫曼图片压缩报告成绩实验者xx专业班级xxx组别同组者 完成日期2016年5月2日第一部分:实验分析与设计(可加页)一、 实验目的和要求1.目的 = 掌握树的存储结构 = 掌握二叉树的三种遍历方法 = 掌握 Huffman 树、Huffman 编码等知识和应用 = 使用 C+、文件操作和 Huffman 算法实现“图片压缩程序”专题编程。2.要求=针对一幅 BMP 格式的图片文件,统计 256 种不同字节的重复次数,以每 种字节重复次数作为权值,构造一颗有 256 个叶子节点的哈夫曼二叉树。 =利用上述哈夫曼树产生的哈夫曼编码对图片文件进行压缩。=压缩后的文件与原图片文件同名,加上后缀.huf(保留原后缀),如 pic.bmp 压缩后 pic.bmp.huf二、 分析与设计依据上述的实验目的与要求,可导出实现的二叉树与赫夫曼图片压缩软件的流程为: 读取图片文件、统计权值 生成 Huffman 树 生成 Huffman 编码 压缩图片文件 保存压缩的文件1. 数据结构的设计l 记录统计256种不同字节的重复次数使用整型数组。 int weight256 = 0 ;l 二叉树的存储结构。使用结构体存储节点,使用数组存储树的节点,使用静态二叉链表方式存储二叉树。l Huffman编码存储结构 struct HTNodeint weight;/权值int parent;int lchild;int rchild;char zifu;string bianma;l 压缩文件的算法的数据结构 为正确解压文件,除了要保存原文件长度外,还要保存原文件中256种字节重复的次数,即权值。定义一个文件头,保存相关的信息: struct HEADchar type4;int length;int weight256;压缩文件时,定义一个内存缓冲区: typedef char * pBuffer; /其大小视原文件压缩后的大小2.核心算法设计(1)生成Huffman树和Huffman编码的算法void Select(HTNode huffTree,int m)int min,min2,i;min=min2=1000;for(i=0;i<m;i+)if(huffTreei.parent=-1)if(min>huffTreei.weight )min2=min;min=huffTreei.weight ;x2=x1;x1=i;else if(min2>huffTreei.weight )min2=huffTreei.weight ;x2=i;void creatHuffman(int huff)int i;int s=256;for(i=0;i<2*s-1;i+)HuffmanTreei.parent =-1;HuffmanTreei.lchild =-1;HuffmanTreei.rchild =-1;for(int i1=0;i1<s;i1+)HuffmanTreei1.weight=huffi1;for(int k=s;k<2*s-1;k+)Select(HuffmanTree,k);HuffmanTreex1.parent =k;HuffmanTreex2.parent =k;HuffmanTreek.weight =HuffmanTreex1.weight +HuffmanTreex2.weight ;HuffmanTreek.lchild =x1;HuffmanTreek.rchild =x2;void HuffmanCoding(HTNode huffTree,int n)int i,j=0;for(i=2*(n-1);i>n-1;i-)huffTreehuffTreei.lchild .bianma ="0"huffTreehuffTreei.rchild .bianma ="1"for(i=0,j=0;j<n;j+)while(huffTreei.parent !=-1)huffTreej.bianma =huffTreehuffTreei.parent.bianma +huffTreej.bianma ;i=huffTreei.parent ;i=j+1;(2)压缩编码算法struct HEADchar type4;int length;int weight256;char Str2byte(const char * pBinStr)char b=0x00;for(int i=0;i<8;i+)b=b<<1;if(pBinStri='1')b=b|0x01;return b;bool InitHead(const char *p &sHead)char ch;/初始化文件strcpy(sHead.type,"HUF");sHead.length=0;for(int i=0;i<256;i+)sHead.weighti=0;ifstream in;in.open(p);while(in.get(ch) sHead.weight(unsigned char)ch+;sHead.length+; cout<<sHead.length<<"字节"<<endl;return true;int Encode(const char *p * &pBuffer,const int nSize) pBuffer=(char *)malloc(nSize * sizeof(char)+10);if(!pBuffer)cout<<"开辟缓冲区失败"<<endl;char cd256=0;int pos=0;int ch;FILE *in=fopen(p,"rb");while(ch=fgetc(in)!=EOF)strcat(cd,HuffmanTreech.bianma.c_str();while(strlen(cd)>=8)/cout<<cd<<" "<<Str2byte(cd)<<" "pBufferpos+=Str2byte(cd);/cout<<pBufferpos-1<<endl;for(int i=0;i<256-8;i+)cdi=cdi+8;if(strlen(cd)>0)pBufferpos+=Str2byte(cd);return 1;int Write char * p ,const HEAD sHead, char * pBuffer,const int nSize)/生成文件名char 256=0;strcpy();int i;for( i=strlen();i!='.'i-); i='0'strcat(,".huf");/以二进制流的形式打开文件FILE *out =fopen( ,"wb");/写文件头fwrite( & sHead,sizeof(HEAD),1,out);/写压缩后的编码fwrite(pBuffer,sizeof(char),nSize,out);/关闭文件释放文件指针fclose(out);out=NULL;cout<<"生成压缩文件"<<<<endl;int len=sizeof(HEAD)+strlen(p)+1+nSize;return len;int compress(const char *p weight256,const HEAD sHead)/计算缓冲区的大小int nSize=0;for(int i=0;i<256;i+)nSize+=weighti*HuffmanTreei.bianma.length();nSize=(nSize%8)?nSize/8+1:nSize/8;/cout<<"nSize"<<nSize<<endl;char *pBuffer=NULL;Encode(p);/if(pBuffer=NULL)/ cout<<" wrong"<<endl;if(!pBuffer)return 0;int result=Write);return result;3.测试用例设计l 使用一个文本文件作为压缩的例,观察其压缩比; l 通过屏幕截图形成一个BMP图片文件,观察其压缩比; l 在互联网上搜索下载任意格式的图片文件,观察其压缩比。三、主要仪器设备及耗材1.安装了Windows 10或其它版本的Windows操作系统的PC机1台2.PC机系统上安装了Microsoft Visual Studio 2010开发环境第二部分:实验过程和结果(可加页)一、 实现说明在Microsoft Visual Studio 2010集成开发环境中新建一个Win32控制台应用程序工程HfmCompressConsole。 HfmCompressConsole工程中新建2组相关文件。第1组是实现依据图片文件构建其Huffman编码的头文件Huffman.h和源程序文件Huffman.cpp。第2组是实现图片文件压缩编码和写磁盘等功能的头文件Compress.h和源程序文件Compress.cpp。 Huffman.h存放与Huffman.cpp相关函数需要的数据类型的定义,函数原型的声明等。Compress.h存放与Compress.cpp相关函数需要的数据类型的定义,函数原型的声明等。 最后新建一个main.cpp源文件,实现main函数按分析与设计中规定的流程调用Huffman.cpp和Compress.cpp的功能函数。二、 调试说明(调试手段、过程及结果分析)调试主要内容为编写程序的语法正确性与否,程序逻辑的正确性与否。调试手段主要采用了Microsoft Visual Studio 2010集成开发环境中“调试(D)”菜单中的调试方法或手段。即:F5:启动调试;F11:逐语句调试;F12:逐过程调试;F9:切换断点;ctrl+B:新建断点等。 例如在统计图片文件中0-255取值的256个字节出现的次数函数中,设置断点并使用简单的文本文件进行测试,发现了“没有扫描完整个文件而是中途跳出”的问题。通过断点出查看weight数组的值以及通过逐语句跳出的处定位错误所在之处。找出问题的原因是以流的形式读入的字符定义问题,char ch;ch=fgetc(in);Weightch+;字符变量ch在转换成int时出现了负数。当将ch的定义修改Unsigned char ch;问题解决。 再例:文件编码压缩Encode()函数会产生编码后的一个缓冲区char *pBuffer;写文件函数会使用它直接写磁盘文件。调试过程中并没发现任何问题,就是不能成功地写后缀为.huf的文件。在相关函数中设置断点,观察缓冲区的情况,且编写屏幕输出缓冲区数据的程序段,发现缓冲区是空的。通过在Encode函数中以及WriteFile函数中做同样的跟踪调试,发现在Encode函数中建立的缓冲区数据并没有带出来,通过分析发现是缓冲区空间构建位置的问题,即不能放在Encode函数中。三、 软件测试(测试效果.界面、综合分析和结论)1测试效果.界面2综合分析和结论试验在压缩txt文件的时候没有问题,可以通过编译生成可执行文件,但是在进行图片的压缩时出了问题,导致程序出错,所以我编写的哈夫曼树压缩文件不能正确压缩图片。 第三部分:实验小结、收获与体会通过这次试验,我对Huffman树的创建和Huffman编码的产生有了更深的理解,同时对于文件的压缩有了更进一步的认识也更加理解了数据结构在实际应用中的作用。通过本次试验也使我感到自身编程能力的欠缺,在数据结构课程的学习中还有很多知识没有熟练掌握,动手能力不强,在以后的学习中要不断加强知识的积累,提高自己的动手能力,

    注意事项

    本文(武汉理工大学数据结构与算法综合实验哈夫曼树 (1).docx)为本站会员(scccc)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开