哈夫曼树课程设计报告书
哈夫曼树课程设计报告

数据结构课程设计报告设计题目:哈夫曼树应用专业:软件工程班级:软件学生:学号:指导教师:罗作民 / 张翔起止时间:2011-07-04—2011-07-082011 年春季学期目录一.具体任务 (2)1功能 (2)2分步实施………………………………………………………………………...2.3要求 (2)二.哈夫曼编码 (2)1问题描述 (2)2.基本要求 (3)3实现提示 (3)三.设计流程图 (4)1建立哈夫曼树 (4)2编码 (5)3译码 (6)4主程序 (7)四.设计概要 (8)1问题哈夫曼的定义....................................................................................... .......8..2所实现的功能函数如下 (8)3功能模块 (8)五.源程序 (9)六.调试分析 (15)七.心得与体会 (18)八.参考文献 (18)一、任务题目:哈夫曼树应用1.功能:1.从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上;2.利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中,并输出结果,将文件CodeFile以紧凑格式先是在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrint中。
3.利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中,并输出结果。
2.分步实施:1)初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2)完成最低要求:完成功能1;3)进一步要求:完成功能2和3。
有兴趣的同学可以自己扩充系统功能。
3.要求:1)界面友好,函数功能要划分好2)总体设计应画一流程图3)程序要加必要的注释4)要提供程序测试方案5)程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
huffman哈夫曼树编码译码课程设计报告

数据结构课程设计信息科学与工程学院:学院计算机科学与技术专业:1601 计卓级:班号:学:学生姓名指导教师:23/ 1年月日题目名称一、实验内容哈夫曼编码译码系统【问题描述】用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站写一个哈夫曼码的编/译码系统。
【基本要求】1)初始化。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。
2)编码。
利用已建好的哈夫曼树对输入英文进行编码,编码结果存储在数组中。
3)译码。
利用已建好的哈夫曼树将数组中的代码进行译码,结果存入一个字符数组。
4)输出编码。
将编码结果显示在终端上,每行50个代码。
5)输出哈夫曼树。
将哈夫曼树以直观的方式(树或凹入表形式)显示出来。
【实现提示】用户界面可以设计为“菜单”方式,再加上一个“退出”功能。
请用户键入一个选择功能符。
此功能执行完毕后再显示此菜单,直至某次用户选择了“退出”为止。
参考教材P240-246【选做内容】将哈夫曼树保存到文件中,编码和译码的结果也分别存放在两个文本文件中。
23/ 2二、数据结构设计储存结构struct HNodeType {//字符结构体类型int weight;//权int parent;//双亲位置int lchild;//左孩子int rchild;//右孩子char inf;// 字符};struct HcodeType {存储编码int bit[MaxBit];// int start;// 起始位置};三、算法设计1、在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1。
建立huffman树课程设计

建立huffman树课程设计一、课程目标知识目标:1. 学生理解霍夫曼编码的基本概念,掌握霍夫曼树的结构特点及其构建过程。
2. 学生能够运用霍夫曼编码进行数据压缩,并理解其在信息传输中的应用。
3. 学生掌握霍夫曼树与贪心算法之间的关系,了解贪心算法在霍夫曼树构建中的应用。
技能目标:1. 学生能够独立构建霍夫曼树,并运用其进行数据压缩和解压缩。
2. 学生通过实际案例,学会运用霍夫曼编码解决实际问题,提高解决问题的能力。
情感态度价值观目标:1. 学生培养对数据结构和算法的兴趣,认识到编程解决问题的实际意义。
2. 学生在团队协作中,培养沟通、合作能力,增强集体荣誉感。
3. 学生通过学习霍夫曼编码,认识到信息科技在生活中的广泛应用,激发对科技创新的热情。
课程性质:本课程为计算机科学领域的数据结构与算法内容,以理论教学和实践操作相结合的方式进行。
学生特点:学生为高中二年级学生,具备一定的编程基础和信息素养,对新鲜事物充满好奇心,喜欢动手实践。
教学要求:教师需注重理论与实践相结合,注重引导学生发现问题和解决问题,鼓励学生进行团队合作,提高学生的编程能力和实际应用能力。
通过本课程的学习,使学生能够将所学知识应用于实际生活,为培养创新型人才奠定基础。
二、教学内容1. 引言:介绍数据压缩的概念和重要性,引入霍夫曼编码及其在数据压缩中的应用。
相关教材章节:第3章 数据结构与算法,第2节 数据压缩技术。
2. 理论知识:a) 霍夫曼编码的基本原理和算法步骤。
b) 霍夫曼树的结构特点及其构建方法。
c) 贪心算法在霍夫曼树构建中的应用。
相关教材章节:第3章 数据结构与算法,第2节 数据压缩技术;第4章 算法设计与分析,第3节 贪心算法。
3. 实践操作:a) 手动构建霍夫曼树,进行数据压缩和解压缩。
b) 编程实现霍夫曼编码和译码过程。
c) 分析实际案例,运用霍夫曼编码解决数据压缩问题。
相关教材章节:第3章 数据结构与算法,第2节 数据压缩技术;第6章 编程实践,第1节 算法实现。
数据结构哈夫曼树的构造及其应用课程设计实验报告

目录第一章哈夫曼树的基本术语 (1)1.1路径和路径长度 (1)1.2树的带权路径长度 (1)1.3哈夫曼树的定义 (1)第二章哈夫曼树的构造 (2)2.1哈夫曼树的构造 (2)第三章哈夫曼树的存储结构及哈夫曼算法的实现 (3)3.1哈夫曼树的存储结构 (3)3.2 哈夫曼算法的简要描述 (3)第四章哈夫曼树的应用 (5)4.1哈夫曼编码 (5)4.2求哈夫曼编码的算法 (5)4.21思想方法 (5)4.22字符集编码的存储结构及其算法描述 (6)4.3哈夫曼树和编码程序实现: (6)4.4程序运行结果: (9)心得体会 (10)参考文献 (10)第一章哈夫曼树的基本术语1.1路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或子孙结点之间的通路,称为路径。
通路中分支的数目称为路径长度。
若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。
1.2结点的权及带权路径长度若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。
结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。
1.2树的带权路径长度树的带权路径长度(Weighted Path Length of Tree):也称为树的代价,定义为树中所有叶结点的带权路径长度之和,通常记为:其中:n表示叶子结点的数目wi和li分别表示叶结点ki的权值和根到结点ki之间的路径长度。
1.3哈夫曼树的定义在权为wl ,w2,…,wn的n个叶子所构成的所有二叉树中,带权路径长度最小(即代价最小)的二叉树称为最优二叉树或哈夫曼树。
[例]给定4个叶子结点a,b,c和d,分别带权7,5,2和4。
构造如下图所示的三棵二叉树(还有许多棵),它们的带权路径长度分别为:(a)WPL=7*2+5*2+2*2+4*2=36(b)WPL=7*3+5*3+2*1+4*2=4(c)WPL=7*1+5*2+2*3+4*3=35其中(c)树的WPL最小,可以验证,它就是哈夫曼树。
哈夫曼树及其应用

****课程设计报告题目:哈夫曼树及其应用学生姓名:何昆学号:0418班级:1121804指导教师:张军2021年 1 月10 日目录一、需求分析说明 (3)1.课程设计目的 (3)2.课程设计题目 (3)3.程序功能及需求说明 (3)二、整体设计 (4)1.哈夫曼树成立 (4)2.哈夫曼编码 (4)3.哈夫曼译码 (4)三、详细设计 (5)1. 算法设计 (5)2. 类设计 (5)四、实现部份 (6)五、程序测试 (9)六、总结 (10)一、需求分析说明1、课程设计目的本课程设计的目的考察学生对常见数据结构及相关算法的综合应用能力,达到理论与实际应用相结合,使同窗们能够依照数据对象的特性,学会数据组织的方式,解决实际问题中数据的合理存储表示,并依照相应的存储结构设计效率较高的算法实现对问题的求解;通过这次课程设计进一步培育学生良好的程序设计技术和分析问题解决问题的能力。
二、课程设计题目:哈夫曼树及其应用(1).设计目的:熟悉树的各类存储结构及其特点及把握成立哈夫曼树和哈夫曼编码的方式及带权途径长度的计算。
(2).设计内容:欲发一封内容为AABBCAB ……(共长 100 字符,其中:A 、B 、C 、D 、E 、F别离有7 、9 、12 、22 、23、27个)的电报报文,实现哈夫曼编码和译码。
(3).设计要求:分析系统需求。
成立哈夫曼树。
进行哈夫曼编码,并求出平均编码长度。
译码,对编码好的内容进行译码。
3、程序功能及需求说明功能:编码,编码长度,译码要实现编码译码等功能,必需先成立一个哈夫曼树,编码长度、译码又通过编码求得。
那个地址通过别离创建结点类(tree)和编码类(codetype),子函数有哈夫曼树成立(creathuffmantree),哈夫曼编码(arrangecode),哈夫曼译码(transcode),最后通过主函数挪用执行。
2.哈夫曼树编码(途径往左为0,往右为1)带权途径长度:WPL=7*4+9*4+12*3+22*2+23*2+27*2=244平均编码长度为:4+5+5+6+6+7=33(1).成立哈夫曼树的算法:概念各节点类型其中应包括两类数据一是权值域weight;一是指针域而指针域中应该包括指向左右小孩和指向双亲的指针那个地址别离用lchild、rdhild 和parent来表示,在实际构造中由于是叶子节点来构造新的根节点其构造进程中仅与叶子节点的权重有关而与其数据域无关因此构造进程中不用考虑其数值域,而且在链表中从叶子开始寄存,让后不断的将两颗最小权值的子树归并为一颗权值为其和的较大的子树,慢慢生成各自内部节点直到树根。
哈夫曼树_实验报告

一、实验目的1. 理解哈夫曼树的概念及其在数据结构中的应用。
2. 掌握哈夫曼树的构建方法。
3. 学习哈夫曼编码的原理及其在数据压缩中的应用。
4. 提高编程能力,实现哈夫曼树和哈夫曼编码的相关功能。
二、实验原理哈夫曼树(Huffman Tree)是一种带权路径长度最短的二叉树,又称为最优二叉树。
其构建方法如下:1. 将所有待编码的字符按照其出现的频率排序,频率低的排在前面。
2. 选择两个频率最低的字符,构造一棵新的二叉树,这两个字符分别作为左右子节点。
3. 计算新二叉树的频率,将新二叉树插入到排序后的字符列表中。
4. 重复步骤2和3,直到只剩下一个节点,这个节点即为哈夫曼树的根节点。
哈夫曼编码是一种基于哈夫曼树的编码方法,其原理如下:1. 从哈夫曼树的根节点开始,向左子树走表示0,向右子树走表示1。
2. 每个叶子节点对应一个字符,记录从根节点到叶子节点的路径,即为该字符的哈夫曼编码。
三、实验内容1. 实现哈夫曼树的构建。
2. 实现哈夫曼编码和译码功能。
3. 测试实验结果。
四、实验步骤1. 创建一个字符数组,包含待编码的字符。
2. 创建一个数组,用于存储每个字符的频率。
3. 对字符和频率进行排序。
4. 构建哈夫曼树,根据排序后的字符和频率,按照哈夫曼树的构建方法,将字符和频率插入到哈夫曼树中。
5. 实现哈夫曼编码功能,遍历哈夫曼树,记录从根节点到叶子节点的路径,即为每个字符的哈夫曼编码。
6. 实现哈夫曼译码功能,根据哈夫曼编码,从根节点开始,按照0和1的路径,找到对应的叶子节点,即为解码后的字符。
7. 测试实验结果,验证哈夫曼编码和译码的正确性。
五、实验结果与分析1. 构建哈夫曼树根据实验数据,构建的哈夫曼树如下:```A/ \B C/ \ / \D E F G```其中,A、B、C、D、E、F、G分别代表待编码的字符。
2. 哈夫曼编码根据哈夫曼树,得到以下字符的哈夫曼编码:- A: 00- B: 01- C: 10- D: 11- E: 100- F: 101- G: 1103. 哈夫曼译码根据哈夫曼编码,对以下编码进行译码:- 00101110111译码结果为:BACGACG4. 实验结果分析通过实验,验证了哈夫曼树和哈夫曼编码的正确性。
哈夫曼树课程设计报告(DOC)

课程设计题目:哈夫曼编码器院系:专业班级:学号:学生姓名:指导教师:2014年1月2日课程设计需求分析报告一、分析问题和确定解决方案1.分析问题利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统,为这样的信息收发站写一个哈夫曼的编/译码系统。
2.确定解决方案设计建立带权的哈夫曼树,确定哈夫曼树的类与成员函数,以及各函数之间的调用关系,采用动态数组的存储结构存储所需要的数据,通过不同的函数来实现编码,译码以及打印二进制编码、哈夫曼树,把不同的数据存入不同的txt文件中,通过主函数调用来实现功能检测。
3.输入的形式和输入值的范围手动或者从文本中读入数据的形式初始化哈夫曼树,从键盘中或者文件中读入数据,以字母A-Z代表结点,以自然数代表权值,字符串提示使用者所要执行的操作。
4.输出的形式在显示器界面上或者以文本的形式来实现程序调试的输出。
5.程序所能达到的功能(1)初始化。
手动输入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件WritehfmTree中,输出哈夫曼树及各字符对应的编码存于WritehfmCode;从文本中读入字符,建立哈夫曼树存于ReadhfmTree, 输出哈夫曼树及各字符对应的编码存于ReadhfmCode.(2)编码。
手动输入一串大写英文字符,该字符存于WriteToBeTron中,对字符进行编码并将它存于WriteCodeFile中;从文件中读取字符编码并存于ReadCodeFile中。
(3)印代码文件。
将文件ReadCodeFile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的代码码写入文件CodePrint中。
(4)印哈夫曼树。
将初始化的哈夫曼树以直观的方式显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。
哈夫曼树课程设计报告c语言

哈夫曼树课程设计报告c语言哈夫曼树是广泛应用于数据压缩和编码的一种数据结构。
在计算机科学中,哈夫曼编码是一种无损的压缩算法,它基于使用较少的位数来表示频繁出现的字符,从而达到节省空间的目的。
本篇文章将围绕哈夫曼树的课程设计报告进行阐述,帮助读者更加深入地理解和应用哈夫曼树。
首先,我们需要了解哈夫曼树的基本概念和算法。
哈夫曼树是一种二叉树,它的每个节点都表示一个字符和它出现的频率。
哈夫曼树的算法主要是通过构建最小权重树来实现,即将输入的字符按照出现的频率进行排序,然后选择出现频率最小的两个字符,将它们合并成一个节点。
这个新节点的权重就是两个字符的权重之和。
继续将这个新节点与下一个最小频率字符继续合并,直到所有字符合并成一个节点。
最终形成的二叉树就是哈夫曼树。
接下来,我们需要学习如何在C语言中实现哈夫曼树。
在实现过程中,我们需要定义一个结构体来表示哈夫曼树节点。
这个结构体包含两个成员:字符和出现的频率。
同时,我们需要定义一个优先队列来存储字符节点和它们的权重。
在优先队列中,我们需要实现一些基本操作,比如插入、删除和取出队首元素等等。
通过这些操作,我们就可以按照字符频率构建出哈夫曼树。
最后,我们需要实现哈夫曼编码的功能。
在哈夫曼编码中,我们需要定义一个数组来存储每个字符的编码。
这个数组的索引是字符的ASCII码,它的值是该字符的哈夫曼编码。
在对输入字符串进行编码时,我们从哈夫曼树的根节点开始,按照左右子树的方向进行编码。
当遇到叶子节点时,我们就将编码添加到输出字符串中。
最终,我们就可以完成对字符串的压缩和解压。
综上所述,哈夫曼树是一种非常有用的数据结构,它在数据压缩和加密领域都有广泛的应用。
通过本篇文章的介绍,希望读者们能够更加深入地理解哈夫曼树的基本概念和实现方法。
在学习过程中,读者们也可以尝试自己动手实现哈夫曼树,并应用到实际的项目中,提高自己的编程能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下载可编辑
工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。 2、设计的题目要求达到一定工作量(300 行以上代码),并具有一定的深度和难度。 3、程序设计语言推荐使用 C/C++,程序书写规范,源程序需加必要的注释; 4、每位同学需提交可独立运行的程序; 5 、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于 10 页(代码不算); 6、课程设计实践作为培养学生动手能力的一种手段,单独考核
1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力; 4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培 养他们严谨的科学态度和良好的工作作风。
.专业.整理.
2、主要函数及相关功能
下载可编辑
1 在数组 hfmNode 中从 O 开始到 pos 位置,查找哈夫曼树外的权值最小的两个结点的位置 void huffmanTree::select(int pos,int &nodeOne,int &nodeTwo)
2 创建哈夫曼树,nvalue 是结点值,w 是权值,n 是叶子结点的个数 void huffmanTree::creatHfmTree(char nvalue[],int w[],int n)
下载可编辑
中南林业科技大学 课程设计报告
设计名称:
数据结构课程设计
姓 名: 王昆
学 号: 20094282
专业班级:
2009 级软件工程
系 (院):
计算机与信息工程学院
设计时间:
2010~2011 学年第二学期
设计地点:
电子信息楼 机房
指导教师评语:
成绩:
.专业.整理.
签名:
年月日
下载可编辑
1.课程设计目的
哈夫曼树类定义 class huffmanTree{ public: void code(char nvalue[],int w[],int n); //对叶子结点编码 void decode(char nvalue[],char hfmcode[],int n);//对叶子结点译码 void Output(huffmanTree ht,int n);//输出哈夫曼树 //private: hfmnode hfmNode[2000];//用数组存储哈夫曼结点 void creatHfmTree(char nvalue[],int w[],int n);//创建哈夫曼树 void select(int pos,int &nodeOne,int &nodeTwo);//查询最小的两个结点 };
.专业.整理.
。
二 概要设计
程序流程图
下载可编辑
.专业.整理.
图1
下载可编辑
.专业.整理.
三 详细设计 1、哈夫曼树结点结构定义
下载可编辑
struct hfmnode {
char nValue;//节点值 int weight;//权值 int pnIndex;//父结点下标 int lchildIndex,rchildIndex;//左右孩子的结点下标 };
.专业.整理.
下载可编辑
2.课程设计任务与要求:
任务 . 哈夫曼树应用
功能: (1) 从终端读入字符集大小 n,以及 n 个字符和 n 个权值,建立哈夫曼树并将它存于文件 hfmTree 中.将已在内存
哈夫曼树 以直观的方式(比如树)显示在终端上; (2) 利用已经建好的哈夫曼树(如不在内存,则从文件 htmTree 中读入),对文件 ToBeTran 中的正文进行编码 后将结果存 入文件 Cod eFile 中,并输出结果,将文件 CodeFile 以紧凑格式先是在终端上,每行 50 个代码。同时将此 形式的 编码文件写入文件 CodePrint 中。 (3) 利用已建好的哈夫曼树将文件 CodeFile 中的代码进行译码,结果存入文件 TextFile 中,并输出结果。 分步实施:
5 检查输入的字符值是否合法 bool isChar(const string& str)
6 输出哈夫曼树,字符,权值,以及它对应的编码 void huffmanTree::Output(huffmanTree ht,int n)
.专业.整理.
下载可编辑
3、源程序
#include<iostream> using namespace std;
3 求哈夫曼树的编码 nvalue 是结点值数组,w 是权值数组 n 是叶子结点的个数 void huffmanTree::code(char nvalue[],int w[],int n)
4 哈夫曼译码 nvalue 为结点值数组 hfmcode 为哈夫曼编码,n 个叶子结点 void huffmanTree::decode(char nvalue[],char hfmcode[],int n)
3.课程设计说明书
一 需求分析
要求用到数据结构课上学到的线性表的知识,所以就要充分而清晰的理解关于线性表的知识。 要求实现的基本功能很简单,只有删除和插入,增加功能也不过是加上修改。这些在数据结构课上已经讲过,只要能够 理解关于线性表的几个相关的基本算法就可以了。 问题是将输入的信息保存入文件和从文件输出。这里基本是自学的内容,而且要考虑到是否要自行选择保存的磁盘。 综上,做这个课题,要具备的知识就是线性表的基本算法,文件的保存和读取算法,必要的 C 或者 C++知识(本次我将 使用 C 实现),以及丰富的程序调适经验。
1) 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数; 2) 完成最低要求:完成功能 1; 3) 进一步要求:完成功能 2 和 3。有兴趣的同学可以自己扩充系统功能。
要求: 1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、 编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试