贪心算法多机调度实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(); }