贪心算法多机调度实验报告

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

一.实验目的

(1)了解前缀编码的概念,理解数据压缩的基本方法;

(2)掌握最优子结构性质的证明方法;

(3)掌握贪心法的设计思想并能熟练运用。

二.实验内容

1.题目要求:

(1)哈夫曼编码。(以P116表4-1中所列的字符出现的概率,采用贪心算法构造哈夫曼树,并给出哈夫曼编码)

2.算法分析与设计过程

(1)根据给定的n个权值{w(1),w(2),…,w(n)}构成n棵二叉树的森林F=(T1,…,Tn)。其中每棵二叉树中只有一个带权为w(k)的根结点,其左右子树为空。

(2)在F中选取两棵结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上结点权值之和。

(3)在F中删除这两棵树,并把新得的二叉树加入F中。

(4)重复以上 2),3),直到F只含一棵树为止。这棵树即为哈夫曼树。

3.实验结果

(4)程序(见附录)

三.实验总结

通过本次实验,我掌握了哈夫曼编码的要点。知道了哈夫曼提出构造最优前缀的贪心算法,由此产生的编码称为哈夫曼编码,并且掌握了贪心算法设计的步骤。

附录

#include

#define n 6 //一共有n棵左右孩子均为空的树

#define m 2*n-1 //生成哈夫曼树后共有2*n-1个节点

float small1,small2;

int flag1,flag2,count;

typedef struct HuffmanTree {

float weight;

int lchild,rchild,parent;

}huffman;

huffman huffmantree[m];

void CreatHuffmanTree() {

int i;

void select();

printf("请输入%d棵树的权值:",n); //初始化每棵树的权值

for(i=0;i

scanf("%f",&huffmantree[i].weight);

printf("\n");

for(i=0;i

{

huffmantree[i].lchild=-1;

huffmantree[i].rchild=-1;

huffmantree[i].parent=-1;

}

for(count=n;count

{

select();

huffmantree[flag1].parent=count;

huffmantree[flag2].parent=count;

huffmantree[count].weight=small1+small2;

huffmantree[count].lchild=flag1; //值最小的作为左孩子

huffmantree[count].rchild=flag2;

}

}

void select()

{

int i,a,b;

float stemp;

int ftemp;

a=0;b=0;

for(i=0;i

{

if(huffmantree[i].parent==-1)

{

if(a==0)

{

small1=huffmantree[i].weight;

flag1=i;

a=a+1;

}

else if(b==0)

{

small2=huffmantree[i].weight;

flag2=i;

b=b+1;

}

}

if((a==1)&&(b==1))

break;

}

if(small1>small2)

{

stemp=small1;

small1=small2;

small2=stemp;

ftemp=flag1;

flag1=flag2;

flag2=ftemp;

}

for(i=0;i

if(huffmantree[i].parent==-1)

if((flag1!=i)&&(flag2!=i))

if(huffmantree[i].weight

{

small2=huffmantree[i].weight;

flag2=i;

if(small1>small2)

{

stemp=small1;

small1=small2;

small2=stemp;

ftemp=flag1;

flag1=flag2;

flag2=ftemp;

}

}

}

void huffmancode()

{

int a[n],j,k,i,c;

for(i=0;i

{

j=i;

c=0;

while(huffmantree[j].parent!=-1)

{

k=huffmantree[j].parent;

if(huffmantree[k].lchild==j)

a[c]=0;

if(huffmantree[k].rchild==j) a[c]=1;

c=c+1;

j=k;

}

printf("节点%d的哈夫曼编码为:",i);

for(c=c-1;c>-1;c--)

printf("%d",a[c]);

printf("\n");

}

}

void main()

{

CreatHuffmanTree();

huffmancode();

}

相关文档
最新文档