当前位置:文档之家› 武汉理工大学数据结构与算法综合实验哈夫曼树

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

//cout<<cd<<" "<<Str2byte(cd)<<" "; pBuffer[pos++]=Str2byte(cd);//cout<<pBuffer[pos-1]<<endl; for(int i=0;i<256-8;i++) {
cd[i]=cd[i+8]; } } } if(strlen(cd)>0) { pBuffer[pos++]=Str2byte(cd); } return 1;
sHead.weight[i]=0; } ifstream in; in.open(pFilename,ios::binary); while(in.get(ch)){ sHead.weight[(unsigned char)ch]++;sHead.length++;}
cout<<sHead.length<<"字节"<<endl;
..
v
.. . .. .
..
.
.. .
} void creatHuffman(int huff[]) {
int i; int s=256;
for(i=0;i<2*s-1;i++) {
HuffmanTree[i].parent =-1; HuffmanTree[i].lchild =-1; HuffmanTree[i].rchild =-1; } for(int i1=0;i1<s;i1++) HuffmanTree[i1].weight=huff[i1]; for(int k=s;k<2*s-1;k++) { Select(HuffmanTree,k); HuffmanTree[x1].parent =k; HuffmanTree[x2].parent =k; HuffmanTree[k].weight =HuffmanTree[x1].weight +HuffmanTree[x2].weight ; HuffmanTree[k].lchild =x1; HuffmanTree[k].rchild =x2;
二、 分析与设计
依据上述的实验目的与要求,可导出实现的二叉树与赫夫曼图片压缩软件的流程为:
① 读取图片文件、统计权值 ② 生成 Huffman 树 ③ 生成 Huffman 编码
④ 压缩图片文件
⑤ 保存压缩的文件
1.数据结构的设计
记录统计256种不同字节的重复次数使用整型数组。
int weight[256] = { 0 };
二、 调试说明(调试手段、过程及结果分析)
..
v
.. .
..
.
.. .
调试主要内容为编写程序的语法正确性与否,程序逻辑的正确性与否。调试手段主要采用了 Microsoft Visual Studio 2010集成开发环境中“调试(D)”菜单中的调试方法或手段。即:F5:启 动调试;F11:逐语句调试;F12:逐过程调试;F9:切换断点;ctrl+B:新建断点等。
b=b<<1; if(pBinStr[i]=='1') {
b=b|0x01; } } return b; } bool InitHead(const char *pFilename,HEAD &sHead) { char ch;
..
v
.. . .. .
..
.
.. .
//初始化文件 strcpy(sHead.type,"HUF"); sHead.length=0; for(int i=0;i<256;i++) {
nSize+=weight[i]*HuffmanTree[i].bianma.length(); } nSize=(nSize%8)?nSize/8+1:nSize/8; //cout<<"nSize"<<nSize<<endl; char *pBuffer=NULL; Encode(pFilename,pBuffer,nSize); //if(pBuffer==NULL)// cout<<" wrong"<<endl; if(!pBuffer) {
}; 压缩文件的算法的数据结构 为正确解压文件,除了要保存原文件长度外,还要保存原文件中256种字节重复的次数, 即权值。定义一个文件头,保存相关的信息:
struct HEAD {
char type[4]; int length; int weight[256]; };
压缩文件时,定义一个内存缓冲区:
filename[i]='\0'; strcat(filename,".huf");
//以二进制流的形式打开文件 FILE *out =fopen(filename ,"wb"); //写文件头 fwrite( & sHead,sizeof(HEAD),1,out); //写压缩后的编码 fwrite(pBuffer,sizeof(char),nSize,out); //关闭文件释放文件指针 fclose(out); out=NULL; cout<<"生成压缩文件"<<filename<<endl;
2.要求
针对一幅 BMP 格式的图片文件,统计 256 种不同字节的重复次数,以每
种字节重复次数作为权值,构造一颗有 256 个叶子节点的哈夫曼二叉树。
利用上述哈夫曼树产生的哈夫曼编码对图片文件进行压缩。 压缩后的文件与原图片文件同名,加上后缀.huf(保留原后缀),如 pic.bmp
压缩后 pic.bmp.huf
return 0; } int result=WriteFile(pFilename,sHead,pBuffer,nSize); return result;
..
v
.. .
..
.
.. .
}
3.测试用例设计
使用一个文本文件作为压缩的例,观察其压缩比; 通过屏幕截图形成一个BMP图片文件,观察其压缩比; 在互联网上搜索下载任意格式的图片文件,观察其压缩比。
..
v
.. .
..
.
.. .
int len=sizeof(HEAD)+strlen(pFilename)+1+nSize; return len; } int compress(const char *pFilename,int weight[256],const HEAD sHead) { //计算缓冲区的大小 int nSize=0; for(int i=0;i<256;i++) {
return true; } int Encode(const char *pFilename,char * &pBuffer,const int nSize) {
pBuffer=(char *)malloc(nSize * sizeof(char)+10); if(!pBuffer) {
cout<<"开辟缓冲区失败"<<endl; }
if(huffTree[i].parent==-1) if(min>huffTree[i].weight ) { min2=min; min=huffTree[i].weight ; x2=x1; x1=i; } else if(min2>huffTree[i].weight ) { min2=huffTree[i].weight ; x2=i; }
..
v
.. .
..
.
.. .
char cd[256]={0}; int pos=0; int ch; FILE *in=fopen(pFilename,"rb"); while((ch=fgetc(in))!=EOF) {
strcat(cd,HuffmanTree[ch].bianma.c_str()); while(strlen(cd)>=8) {
二叉树与赫夫曼图片压缩
实验者
xx
专业班级
xxx
同组者
第一部分:实验分析与设计(可加页)
一、 实验目的和要求
报告成绩 组别
完成日期
2016 年 5 月 2 日
1.目的
掌握树的存储结构 掌握二叉树的三种遍历方法 掌握 Huffman 树、Huffman 编码等知识和应用 使用 C++、文件操作和 Huffman 算法实现“图片压缩程序”专题编程。
三、主要仪器设备及耗材
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 的功能函数。
相关主题