 
         
         
         
         
        
            已阅读5页,还剩1页未读,            继续免费阅读
        
        
                版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
            合肥学院计算机科学与技术系课程设计报告20132014学年第二学期课程数据结构与算法课程设计名称哈弗曼算法专业班级12级软件工程指导教师李红2014年9月题目:设计程序以实现构造哈夫曼树的哈夫曼算法。要求:求解所构造的哈夫曼树的带全路径长度。一、问题分析和任务定义根据要求需要:1、规划哈夫曼树的数据类型; 2、完成对哈夫曼树的输入; 3、构造出哈夫曼树; 4、求出哈夫曼树的带权路径长度; 5、输出哈夫曼树的结点信息。二、数据结构的选择和概要设计数据结构的选择:1. 由于一棵有n个叶子结点的哈夫曼树上共有2n-1个结点,可以采用为2n-1的数组顺序存储结点信息。每个结点包括四个域:一个float类型的weight用来存储每个叶子结点的权值,三个int 类型的parent,rchild,lchild用来表示结点的父节点和左右孩子;结点的类型描述为:typedef struct float weight;int parent,lchild,rchild;hufm;若给定n个权值,则可定义数组tree来存储哈夫曼树上的结点:Hufm tree2n-1;为实现上述功能需要:1. 首先给定n个叶子结点的权值,构造n棵单结点二叉树;2. 在上面的二叉树中选择两个权值最小的结点,分别为左右孩子构造一棵新的二叉树且新的二叉树根结点的权值为其左右子树根结点的权值之和。3. 然后删除掉被选取的两棵二叉树,并将新的二叉树加入。4. 重复2,3两步,直到只剩一颗二叉树为止。5. 由于哈夫曼树的带权路径长度就是等于所有非叶子结点值的和,因为树的带权路径长度是通过将所有叶子结点乘以对应的路径长度之和求出来的,而将所有的非叶子结点的累加过程就是包括了上述的计算,所以直接就可以计算出。三、详细设计和编码 1、程序先输入一个int的n表示共有n个叶子结点,然后输入n个叶子结点的权值;同时将数组内的所有值都初始化为-1; 2、根据概要设计的方法来构造哈夫曼树,将新的父节点放在数组下标为n到2n-2中,所以进行一个外层循环,为确保每次能够找到未含有父结点的权值最小的两个结点,需要定义两个整型的数,small1,small2,在每次比较之前将一个最大值赋给它们,然后进行比较,在一个内层的循环进行,如果找到一个比small1小的结点,就先把small1赋给small2然后,在将这个结点的权值赋给small1,同时类似的用两个整型的数记录这个结点的下标;然后再每次内层循环结束后,将这两个叶子结点的parent值改为这个父节点的下标,将父节点的左右孩子域改为两个孩子结点的下标,将父节点的权值weight变成两个孩子的权值之和。 3、定义一个float类型的sum,初始化为0,然后在每次产生新结点的权值时,就将其累加,其为哈夫曼树的带权路径长度。 4、最后将构造好的哈夫曼树输出在屏幕上,并且输出带权路径长度。四、上机调试过程开始由于没有想到求带权路径长度可以通过上述方法进行,所有还需要在树建好以后进行每个叶子结点求其路径长度,这大大的增加了程序的时间复杂性,最后将其改进。五、测试结果及其分析程序的一开始是将结构体中的元素都初始化为0,但是由于为了更加清晰的表示出构造哈弗曼树的各个结点关系,防止与数组下标为0的进行混淆,将其初始化为-1。图中清晰的表示出了各个结点的信息,其中数组下标为0n的为叶子结点,其lchild与rchild都是-1;weight记录各个结点的权值,parent中的数字为每个结点的父节点所在的元素下标,lchild与rchild分别为其左右孩子的下标。六、用户使用说明 根据屏幕中的提示,先输入叶子结点的个数,然后输入n个叶子结点的权值,其可以为实数,然后回车就可以看到结果了。七、参考文献1 王昆仑,李红. 数据结构与算法. 北京:中国铁道出版社,2006年5月。2 其它。八、附录#include stdio.h#define max 100.0typedef struct float weight;int parent,lchild,rchild;hufm;int main()/p1,p2分别记录相加后节点的两个孩子的位置int n,i,j,p1,p2;float sum=0;hufm tree100;float small1,small2;/用于得到parent为0的两个最小的puts(请输入叶子节点的个数);scanf(%d,&n);for(i=0;i2*n-1;i+)treei.parent=-1;treei.lchild=-1;treei.rchild=-1;puts(请输入哈夫曼树的权值);for(i=0;in;i+)scanf(%f,&treei.weight);for(i=n;i2*n-1;i+)p1=p2=0;small1=small2=max;for(j=0;j=i-1;j+)if(treej.parent=-1) if(treej.weightsmall1) small2=small1; small1=treej.weight; p2=p1;p1=j; else if(treej.weightsmall2) small2=treej.weight; p2=j; treep1.parent=treep2.parent=i; treei.weight=treep1.weight+treep2.weight; sum+=treei.weight;/求树的带权路径长度 treei.lchild=p1; treei.rchild=p2;printf(输出该哈夫曼树的各个结点的值为:n);printf( weight parent lchild rchildn);for(i=0;i2*n-1;i+)pr        
    温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年皮肤科光敏性药物禁忌知识考核试题及答案解析
- 2025年检验检测工程师职业资格考试《检验技术》备考题库及答案解析
- 2025年数控技术专业资格(数控技术员)备考题库及答案解析
- 2024年贵州省公开遴选公务员笔试题及答案解析(A类)
- 2025仓库管理员题库及答案
- 模具工操作评估能力考核试卷含答案
- 铝粒工安全生产能力评优考核试卷含答案
- 香料精制工安全技能测试竞赛考核试卷含答案
- 锻件切边工创新方法竞赛考核试卷含答案
- 碳八抽提苯乙烯装置操作工岗前品牌建设考核试卷含答案
- 202211六年级期中数学考试试卷(102份)
- 中建某公司项目部质量管理奖励与处罚条例
- GBZ/T(卫生) 201.5-2015放射治疗机房的辐射屏蔽规范第5部分:质子加速器放射治疗机房
- GB/T 13384-2008机电产品包装通用技术条件
- GA/T 167-2019法医学中毒尸体检验规范
- FZ/T 07019-2021针织印染面料单位产品能源消耗限额
- 第三章 第1节 水与水溶液 第1课时水的电离 课件 高二上学期化学鲁科版(2019)选择性必修1
- 国家储备林基地建设项目实施方案
- 体检主要检查项目及临床意义共23张课件
- 中国脓毒症及脓毒性休克急诊治疗指南
- DB14-T 2498-2022检验检测机构人员技术档案管理指南-(高清最新)
 
            
评论
0/150
提交评论