淮海工学院计算机工程学院
实 验 报 告 书
课 程 名 : 《算法分析与设计》
题 目: 实验 3 贪心算法
班 级:
学 号:
姓 名:
评语:
成绩:
指导教师:
批阅时间: 年
月
日
《 算法分析与设计》实验报告
- 1 -
实验 3 贪心算法
实验目的和要求
(1)了解前缀编码的概念,理解数据压缩的基本方法;
(2)掌握最优子结构性质的证明方法;
(3)掌握贪心法的设计思想并能熟练运用
(4)证明哈夫曼树满足最优子结构性质;
(5)设计贪心算法求解哈夫曼编码方案;
(6)设计测试数据,写出程序文档。
实验内容
设需要编码的字符集为{d1, d2, …, dn},它们出现的频率为{w1, w2, …, wn},应用哈夫
j
ka
ik
曼树构造最短的不等长编码方案。
实验环境
Turbo C 或 VC++
实验学时
2 学时,必做实验
数据结构与算法
建立哈弗曼树:
void HuffmanTree(element huffTree[],double w[],int n)
{
int i,k,i1,i2;
for(i=0;i<2*n-1;i++)
{
}
huffTree[i].parent=-1;
huffTree[i].lchild=-1;
huffTree[i].rchild=-1;
for(i=0;i
《 算法分析与设计》实验报告
- 2 -
huffTree[i2].parent=k;
huffTree[k].weight=huffTree[i1].weight+huffTree[i2].weight;
huffTree[k].lchild=i1;
huffTree[k].rchild=i2;
}
}
哈弗曼编码:
void Huffmancode(element huffTree[],int n)
{
int i,j,k;
string s;
for(i=0;i
=0;k--)
{
}
cout<《 算法分析与设计》实验报告
- 3 -
#include
#include
using namespace std;
struct element
{
};
double weight;
int lchild,rchild,parent;
void Select(element huffTree[],int k,int &s1,int &s2)
{
int i;
for (i=0;i<=k;i++)
{
}
if(huffTree[i].parent==-1)
{
}
s1=i;
break;
for(i=0;i<=k;i++)
{
}
if (huffTree[i].parent==-1)
{
}
if(huffTree[i].weight《 算法分析与设计》实验报告
- 4 -
s2=i;
break;
{
}
}
for(i=0;i<=k;i++)
{
}
}
if (huffTree[i].parent==-1&&i!=s1)
{
}
if(huffTree[i].weight
《 算法分析与设计》实验报告
- 5 -
huffTree[k].weight=huffTree[i1].weight+huffTree[i2].weight;
huffTree[k].lchild=i1;
huffTree[k].rchild=i2;
}
}
void Huffmancode(element huffTree[],int n)
{
int i,j,k;
string s;
for(i=0;i
=0;k--)
{
}
cout<《 算法分析与设计》实验报告
- 6 -
int n=7;
double w[7]={1,3,3,4,6,7,9};
element huffTree[13];
HuffmanTree(huffTree,w,n);
Huffmancode(huffTree,n);
{
}
实验结果
实验体会
本次实验为哈弗曼树的建立及编码,这在数据结构的时候就学过,但本次实验与以
前学的不太一样,数据结构不一样,没有用到链表和指针,比以前的更容易理解更简单。
但是在实验的时候还是遇到了问题,比如对哈弗曼树中权值较小的两个节点的选取,
改了很长时间才改对,回过头来看又觉得真的是小问题,还有就是关于 string 的一些
相关的知识不是特别熟悉,所以在课外的时候,我们应该或回过头去看一些以前学过的
知识,这样就能更加连贯的理解所学的所以知识。