资源描述:
《算法分析与设计-实验二-哈夫曼编码.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、昆明理工大学信息工程与自动化学院学生实验报告(201—201学年第一学期)课程名称:算法设计与分析开课实验室:年月日年级、专业、班学号姓名成绩实验项目名称哈夫曼编码指导教师教师评语该同学是否了解实验原理:A.了解□B.基本了解□C.不了解□该同学的实验能力:A.强□B.中等□C.差□该同学的实验是否达到要求:A.达到□B.基本达到□C.未达到□实验报告是否规范:A.规范□B.基本规范□C.不规范□实验过程是否详细记录:A.详细□B.一般□C.没有□教师签名:年月日一、上机目的及内容1.上机内容设需要编码的字符集为{d1,d2,…,dn},它们出现的频率为{w1,w2,…,w
2、n},应用哈夫曼树构造最短的不等长编码方案。2.上机目的(1)了解前缀编码的概念,理解数据压缩的基本方法;(2)掌握最优子结构性质的证明方法;(3)掌握贪心法的设计思想并能熟练运用。二、实验原理及基本技术路线图(方框原理图或程序流程图)(1)证明哈夫曼树满足最优子结构性质;(2)设计贪心算法求解哈夫曼编码方案;(3)设计测试数据,写出程序文档。数据结构与算法:typedefchar*HuffmanCode;//动态分配数组,存储哈夫曼编码typedefstruct{unsignedintweight;//用来存放各个结点的权值unsignedintparent,LChild
3、,RChild;//指向双亲、孩子结点的指针}HTNode,*HuffmanTree;//动态分配数组,存储哈夫曼树程序流程图:三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUALC++6.0软件四、实验方法、步骤(或:程序代码或操作过程)程序代码:#include#include#includetypedefstruct{unsignedintweight;unsignedintparent,LChild,RChild;}HTNode,*HuffmanTree;//动态分配数组,存储哈夫曼树
4、typedefchar*HuffmanCode;//动态分配数组,存储哈夫曼编码voidSelect(HuffmanTree*ht,intn,int*s1,int*s2){inti,min;for(i=1;i<=n;i++){if((*ht)[i].parent==0){min=i;break;}}for(i=1;i<=n;i++){if((*ht)[i].parent==0){if((*ht)[i].weight<(*ht)[min].weight)min=i;}}*s1=min;for(i=1;i<=n;i++){if((*ht)[i].parent==0&&i!=(*
5、s1)){min=i;break;}}for(i=1;i<=n;i++){if((*ht)[i].parent==0&&i!=(*s1)){if((*ht)[i].weight<(*ht)[min].weight)min=i;}}*s2=min;}//构造哈夫曼树ht,w存放已知的n个权值voidCrtHuffmanTree(HuffmanTree*ht,int*w,intn){intm,i,s1,s2;m=2*n-1;//总的结点数*ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode));for(i=1;i<=n;i++)//1--n号存
6、放叶子结点,初始化{(*ht)[i].weight=w[i];(*ht)[i].LChild=0;(*ht)[i].parent=0;(*ht)[i].RChild=0;}for(i=n+1;i<=m;i++)//非叶子结点的初始化{(*ht)[i].weight=0;(*ht)[i].LChild=0;(*ht)[i].parent=0;(*ht)[i].RChild=0;}printf("所构造的哈夫曼树为:");for(i=n+1;i<=m;i++)//创建非叶子结点,建哈夫曼树{Select(ht,i-1,&s1,&s2);(*ht)[s1].parent=
7、i;(*ht)[s2].parent=i;(*ht)[i].LChild=s1;(*ht)[i].RChild=s2;(*ht)[i].weight=(*ht)[s1].weight+(*ht)[s2].weight;printf("%d(%d,%d)",(*ht)[i].weight,(*ht)[s1].weight,(*ht)[s2].weight);}printf("");}//从叶子结点到根,逆向求每个叶子结点对应的哈夫曼编码voidCrtHuffmanCode(HuffmanTree*ht,Huf