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

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

学生学号Xxx实验课成绩

学生实验报告书

实验课程名称数据结构与算法综合实验

开课学院计算机科学与技术学院

指导教师姓名xxx

学生姓名xxx

学生专业班级xxxx

2015--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.数据结构的设计

记录统计 256种不同字节的重复次数使用整型数组。

int weight[256] = { 0 };

二叉树的存储结构。使用结构体存储节点,使用数组存储树的节点,使用静态二叉链表方

式存储二叉树。

Huffman编码存储结构

struct HTNode

{

int weight;//权值

1

int lchild;

int rchild;

char zifu;

string bianma;

};

压缩文件的算法的数据结构

为正确解压文件,除了要保存原文件长度外,还要保存原文件中 256种字节重复的次数,即权值。定义一个文件头,保存相关的信息:

struct HEAD

{

char type[4];

int length;

int weight[256];

};

压缩文件时,定义一个内存缓冲区:

typedef char *pBuffer

;//其大小视原文件压缩后的大小

2.核心算法设计

(1) 生成 Huffman 树和 Huffman 编码的算法

void Select(HTNode huffTree[],int m)

{

int min,min2,i;

min=min2=1000;

for(i=0;i

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;

}

}

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

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;

}

}

void HuffmanCoding(HTNode huffTree[],int n)

{

int i,j=0;

for(i=2*(n-1);i>n-1;i--)

{

huffTree[huffTree[i].lchild ].bianma ="0";

huffTree[huffTree[i].rchild ].bianma ="1";

}

for(i=0,j=0;j

{

while(huffTree[i].parent !=-1)

{

huffTree[j].bianma =huffTree[huffTree[i].parent].bianma

+huffTree[j].bianma ;

i=huffTree[i].parent ;

}

i=j+1;

}

}

(2)压缩编码算法

struct HEAD

{

char type[4];

int length;

int weight[256];

相关文档
最新文档