课程设计报告哈夫曼编码
数据结构 哈夫曼编码器课程设计报告

数据结构哈夫曼编码器课程设计报告数据结构哈夫曼编码器课程设计报告1.引言1.1 编写目的本文档旨在详细介绍数据结构课程设计中的哈夫曼编码器的设计过程和实现方法。
1.2 背景哈夫曼编码是一种常用的数据压缩技术,通过构建变长编码表,将频率较高的字符用较短的编码表示,从而减小数据的存储和传输开销。
1.3 参考资料[1] 斯科特·梅耶, 数据结构与算法分析[C], 机械工业出版社, 2014.[2] Thomas H.Cormen, Charles E.Leiserson, RonaldL.Rivest, Clifford Stein, Introduction to Algorithms, The MIT Press, 2009.2.需求分析2.1 功能需求①输入文件用户可以输入需要进行哈夫曼编码的文件路径。
②编码操作系统根据输入的文件,相应的哈夫曼编码,并显示编码结果。
③解码操作用户可以输入已经编码过的文件,系统将根据编码表进行解码,并显示解码结果。
2.2 非功能需求①性能要求系统在处理大规模文件时需要具备较高的性能,保证编码和解码的效率。
②用户友好性系统需要提供简洁明了的界面,方便用户操作。
③可扩展性系统需要具备良好的扩展性,满足未来需求变化的需要。
3.概要设计3.1 总体设计系统采用面向对象的设计方法,主要包含以下几个类:① HuffmanEncoder该类负责对输入文件进行哈夫曼编码的操作。
② HuffmanDecoder该类负责对已编码文件进行解码的操作。
③ HuffmanTree该类是哈夫曼树的实现,用于构建编码和解码所需的编码表。
3.2 类的详细设计① HuffmanEncoder3.①属性●inputFile: 输入文件路径●codeTable: 编码表3.②方法●setInput: string): 设置输入文件路径●generateCodeTable(): 编码表●encodeFile(): 对输入文件进行编码② HuffmanDecoder3.①属性●encodedFile: 已编码文件路径●codeTable: 编码表3.②方法●setEncoded: string): 设置已编码文件路径●setCodeTable(table: object): 设置编码表●decodeFile(): 对已编码文件进行解码③ HuffmanTree3.①属性●root: 哈夫曼树的根节点3.②方法●buildTree(frequencies: object): 根据字符频率构建哈夫曼树●buildCodeTable(): 构建字符与编码的对应关系表4.详细设计4.1 HuffmanEncoder类①属性●inputFile: string,输入文件路径●codeTable: object,编码表②方法4.① setInput: string)●作用:设置输入文件路径●输入:,string类型,输入文件路径●输出:无4.② generateCodeTable()●作用:编码表●输入:无●输出:无4.③ encodeFile()●作用:对输入文件进行编码●输入:无●输出:无5.实现6.测试与验证7.项目总结8.附件8.1 源代码文件8.2 测试文件9.法律名词及注释9.1 哈夫曼编码哈夫曼编码是一种变长编码方法,通过构建树形结构,将频率较高的字符用较短的编码表示。
哈夫曼编码的实验报告

哈夫曼编码的实验报告哈夫曼编码的实验报告一、引言信息的传输和存储是现代社会中不可或缺的一部分。
然而,随着信息量的不断增加,如何高效地表示和压缩信息成为了一个重要的问题。
在这个实验报告中,我们将探讨哈夫曼编码这一种高效的信息压缩算法。
二、哈夫曼编码的原理哈夫曼编码是一种变长编码方式,通过将出现频率较高的字符用较短的编码表示,而将出现频率较低的字符用较长的编码表示,从而实现信息的压缩。
它的核心思想是利用统计特性,将出现频率较高的字符用较短的编码表示,从而减少整体编码长度。
三、实验过程1. 统计字符频率在实验中,我们首先需要统计待压缩的文本中各个字符的出现频率。
通过遍历文本,我们可以得到每个字符出现的次数。
2. 构建哈夫曼树根据字符频率,我们可以构建哈夫曼树。
哈夫曼树是一种特殊的二叉树,其中每个叶子节点代表一个字符,并且叶子节点的权值与字符的频率相关。
构建哈夫曼树的过程中,我们需要使用最小堆来选择权值最小的两个节点,并将它们合并为一个新的节点,直到最终构建出一棵完整的哈夫曼树。
3. 生成编码表通过遍历哈夫曼树,我们可以得到每个字符对应的编码。
在遍历过程中,我们记录下每个字符的路径,左边走为0,右边走为1,从而生成编码表。
4. 进行编码和解码在得到编码表后,我们可以将原始文本进行编码,将每个字符替换为对应的编码。
编码后的文本长度将会大大减少。
为了验证编码的正确性,我们还需要进行解码,将编码后的文本还原为原始文本。
四、实验结果我们选取了一段英文文本作为实验数据,并进行了哈夫曼编码。
经过编码后,原始文本长度从1000个字符减少到了500个字符。
解码后的文本与原始文本完全一致,验证了哈夫曼编码的正确性。
五、讨论与总结哈夫曼编码作为一种高效的信息压缩算法,具有广泛的应用前景。
通过将出现频率较高的字符用较短的编码表示,哈夫曼编码可以在一定程度上减小信息的存储和传输成本。
然而,哈夫曼编码也存在一些局限性,例如对于出现频率相近的字符,编码长度可能会相差较大。
哈夫曼编码设计报告

哈夫曼编码综合设计报告LD摘要 (I)Abstract (II)第一章课题背景 (1)1.1 课题背景 (1)1.2 课题内容 (1)第二章设计简介及设计方案论述 (2)2.1 设计简介 (2)2.2 问题分析 (2)2.3 设计方案 (3)第三章详细设计 (4)3.1 主要流程图 (4)3.2 主要类及函数介绍 (7)第四章设计结果及分析 (8)4.1 设计结果 (8)总结 (11)致谢 (12)参考文献 (13)附录主要程序代码 (14)数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。
因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。
通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
建立在数据结构的基础上,利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
综合设计的任务是:设计一个哈夫曼编码/译码系统,使学生掌握哈夫曼编码的特点、存储方法和基本原理,培养学生利用C++语言编写程序以及调试程序的能力,运用数据结构知识解决实际问题的能力,为后续计算机专业课程的学习打下坚实的基础。
程序设计是为了锻炼我们的实际动手能力,在一定程度上,又增加了我们的各方面的知识,特别是一些联系实际的课程设计,它的完成需要自己平时积累的大量知识、并且需要勤于思考的能力和无限的激情。
本次课设主要是学习程序设计的方法,进行程序设计的基本训练,巩固基础知识,通过思考,和大量的阅读,来构造一个完整的程序。
关键词:数据结构;哈夫曼编码/译码;程序设计AbstractData structure as a major research subject of various logical structure of data and storage structure, and various operations on the data.Therefore, there are three main aspects: the logical structure of data; the data of the physical storage structure; operations on data (or algorithm).Typically, the algorithm design depends on the logical data structure, algorithm implementation depends on the data of the physical storage structure.A data structure of information organization, its purpose is to improve the efficiency of the algorithm, it is usually set with a set of algorithms corresponding to this set of algorithms through the collection of data structures can be some kind of data operation.Established on the basis of the data structure, the use of Huffman coding can greatly improve the communication channel utilization, reduce transmission time information, reducing transmission costs.Integrated design of the task: design a Huffman encoding / decoding system that allows students to master the characteristics of Huffman coding, storage methods and basic principles, students write programs using C language and ability to debug programs using the data structure of knowledgethe ability to solve practical problems for the computer professional courses of study follow-up and lay a solid foundation.Program design is to exercise our practical ability, to a certain extent, but also increase our knowledge of all aspects, especially in some of the curriculum with practice, it needs to complete a large number of accumulated knowledge of their usual and need to be diligentability to think and passion.The main lesson is to learn programming based methods, the basic training program designed to consolidate basic knowledge, through thinking, and a lot of reading, to construct a complete program.Keywords:Data structure; Huffman encoding / decoding; Programming第一章课题背景1.1课题背景《数据结构》在计算机科学中是一门核心专业基础课,在整个计算机课程体系中处于承上启下的核心地位,它一方面扩展和深化在离散数学、程序设计语言等课程学到的基本技术和方法,一方面为进一步学习其它专业课奠定坚实的理论与实践基础。
数据结构课程设计总结报告 哈夫曼编码译码

《数据结构》课程设计实验报告题目哈夫曼编码/译码器学院数理与信息学院专业计算机科学与技术班级计科132学生姓名刘海澍 5周弘杰8徐铭瑶 3指导教师编写日期数据结构课程设计目录1 问题描述.................................................................错误!未定义书签。
2 问题分析.................................................................错误!未定义书签。
3 算法设计 (2)3.1抽象数据类型定义 (2)3.2模块划分 (3)4 详细设计 (4)4.1数据类型的定义 (4)4.2主要模块的算法描述 (4)4.3 流程图 (6)5 测试分析 (9)6 课程设计总结 (10)7 成员分工 (10)参考文献 (11)附录(源程序清单) (12)1.问题描述设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。
1) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;2) 编码:利用建好的哈夫曼树生成哈夫曼编码;3) 输出编码;4)显示哈夫曼树;5)界面设计的优化;6) 设字符集及频度如下表:字符空格 A B C D E F频度4 9 23 2 17 15字符G H I J K频度1 2 3 3 42.问题分析(1)定义一个变量名为HTNode的结构体,用该结构体中的char data、int weight、int parent、int lchild、int rchild分别表示哈夫曼树中每个结点的权值、权重、双亲结点、左孩子、右孩子,再定义一个HTNode类型的数组ht[60]存放哈夫曼树;另外定义一个变量名为HCode的结构体,采用HCode类型变量的cd[start]~cd[n]存放当前结点的哈夫曼编码、最后定义一个HCode类型的数组hcd[30]的数组用于存放当前叶子结点ht[i]的哈夫曼编码。
哈夫曼编码课程设计

目录1设计内容与设计要求 (1)1.1系统的基本功能 (2)1.2系统的设计要求 (2)2 系统需求分析 (1)2.1系统设计目标 (1)2.2哈夫曼算法 (1)3系统的实现 (3)4 程序调试 (3)5 总结 (3)5.1本系统特色 (3)5.2心得体会 (3)附件:源程序清单 (5)1设计内容与设计要求1.1系统的基本功能哈夫曼编码是根据字符出现频率对数据进行编码解码,以便对文件进行压缩的一种方法,目前大部分有效的压缩算法(如MP3编码方法)都是基于哈夫曼编码的。
数据压缩过程称为编码,也就是把文件中的每个字符均转换为一个唯一的二进制串。
数据解压过程称为解码,也就是把给定的二进制位字符串转换为对应的字符。
1.2系统的设计要求(1)数据结构可以使用结构体数组或结构体链表实现,结构体的属性可进行扩充。
(2)由用户输入相应文本。
(3)对于系统运行时,要求有相应的提示信息,方便用户进行选择。
2 系统需求分析2.1系统设计目标(1)哈夫曼树的建立。
(2)哈夫曼编码的生成。
(3)求出平均查找长度。
(4)用户输入权值的个数。
(5)输出的形式为整型。
(6)程序的执行可使用户在输入一列数值后,可得到由这些权值所得到的编码。
2.2 哈夫曼算法哈夫曼算法流程如下:(1)根据给定的N个权值{W1,W2,····,WN}构成N棵二叉树的集合F={T1,T2,T3,···,Tn},其中每棵二叉树Ti中只有一个带权为Wi的根节点,其左右子树均空。
(2)在F中选取两颗根节点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值最小的树为其左右子树上根节点的权值之和。
(3)在F中删除这两棵树,同时将新得到的二叉树加入F中。
(4)重复(2)和(3),直到F只含一棵树为止。
这棵树便是哈夫曼树。
(5)约定左分支表示字符‘0’,右分支表示字符‘1’,则可以从根结点到叶子结点的路径上分支字符组成的字符串作为该叶子结点字符的编码,这就是哈夫曼编码。
数据结构课程设计哈夫曼编码实验

数据结构设计性实验Huffman编码与译码学号姓名班级设计性实验—Huffman 编码与译码一.实验目的:在掌握相关基础知识的基础上,学会自己设计实验算法,熟练掌握Huffman 树的建立方法,Huffman 编码的方法,进而设计出Huffman 译码算法,并编程实现。
二.实验要求:在6学时以内,制作出能够实现基于26个英文字母的任意字符串的编译码。
写出技术工作报告并附源程序。
三.实验内容及任务:1.设字符集为26个英文字母,其出现频度如下表所示。
2.建Huffman 树; 3.利用所建Huffman 树对任一字符串文件进行编码——即设计一个Huffman 编码器;4.对任一字符串文件的编码进行译码——即设计一个Huffman 译码器。
实现步骤:1.数据存储结构设计; 2.操作模块设计; 3.建树算法设计; 4.编码器设计;5. 译码器设计;51 48 1 15 63 57 20 32 5 1频度z y x w v u t 字符11611882380频度p 21 f q15 g r 47 h s o n m l k j 字符 57 103 32 22 13 64 186 频度 i e d c b a 空格 字符四.分析以及算法描述1.分析问题1)首先学习二叉树的知识,了解二叉树的路径、权数以及带权路径长度计算。
2)认识霍夫曼树,了解霍夫曼树的定义,构造霍夫曼树构造算法①又给定的n个权值{w1,w2,w3,……,w n}构造根节点的二叉树,从而得到一个二叉树森林F={T1,T2,T3,……T n}。
②在二叉树森里选取根节点全职最小和此最小的两棵二叉树作为左右节点构造新的二叉树,此时新的二叉树的根节点权值为左右子树权值之和。
③在二叉树森林中删除作为新二叉树的根节点左右子树的两棵二叉树,将新的二叉树加入到二叉树森林F中。
④重复②和③,当二叉树森林F只剩下一棵二叉树时,这棵二叉树是所构造的霍夫曼树。
3)练习通过普通树来构造霍夫曼树。
c哈夫曼编码课程设计

c 哈夫曼编码课程设计一、课程目标知识目标:1. 学生能理解哈夫曼编码的基本原理,掌握其构建过程和应用场景。
2. 学生能运用哈夫曼编码进行数据压缩,并了解压缩比的概念。
3. 学生能理解哈夫曼编码在通信、图像处理等领域的重要性。
技能目标:1. 学生能够运用所学知识,独立构建哈夫曼树并进行编码。
2. 学生能够分析给定数据,选择合适的编码方法进行数据压缩。
3. 学生能够运用编程工具实现哈夫曼编码和解码过程。
情感态度价值观目标:1. 学生通过学习哈夫曼编码,培养对数据压缩技术的兴趣,提高信息素养。
2. 学生在合作学习过程中,培养团队协作能力和沟通能力。
3. 学生了解我国在数据压缩领域的研究成果,增强民族自豪感。
课程性质:本课程为信息技术课程,旨在帮助学生掌握数据压缩的基本方法,提高数据处理能力。
学生特点:学生处于高年级阶段,具备一定的编程基础和逻辑思维能力。
教学要求:结合学生特点和课程性质,注重理论与实践相结合,培养学生的实际操作能力和创新能力。
通过分解课程目标为具体学习成果,使学生在学习过程中能够明确自身的学习进度和目标。
二、教学内容1. 哈夫曼编码基本原理:介绍哈夫曼编码的概念、原理和优势,结合教材相关章节,使学生理解哈夫曼编码在数据压缩中的应用。
- 哈夫曼树的构建方法- 哈夫曼编码的生成过程- 压缩比的概念及其计算方法2. 哈夫曼编码的实际操作:通过实际操作,让学生掌握哈夫曼编码的构建和编码过程。
- 利用编程工具实现哈夫曼树的构建- 编程实现哈夫曼编码的生成- 数据压缩与解压缩的实际操作3. 哈夫曼编码的应用案例分析:结合教材案例,分析哈夫曼编码在通信、图像处理等领域的作用。
- 通信领域的数据压缩- 图像处理中的哈夫曼编码应用- 其他领域中的应用案例4. 编程实践:布置相关编程任务,巩固学生对哈夫曼编码的理解和应用。
- 实现哈夫曼编码的压缩和解压缩程序- 分析不同数据集的压缩效果,优化哈夫曼编码方法教学内容安排和进度:第1课时:哈夫曼编码基本原理及构建方法第2课时:哈夫曼编码的实际操作(构建哈夫曼树、生成编码)第3课时:哈夫曼编码的应用案例分析第4课时:编程实践(实现压缩与解压缩程序,优化编码方法)三、教学方法本课程将采用以下教学方法,以促进学生的主动参与和深入理解:1. 讲授法:对于哈夫曼编码的基本原理和概念,通过教师清晰的讲解,结合教材内容,使学生快速掌握理论基础。
课程设计报告哈夫曼编码

课程设计题目哈夫曼编码学院计算机科学与技术专计算机科学与技术业班级姓名指导教师20 0 010 年7 月2 日课程设计任务书学生姓名:拉巴珠久专业班级:计算机0806指导教师:姚寒冰工作单位:计算机科学系题目:哈夫曼编码初始条件:输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。
(1) 1:初始化(Initialization )。
对输入的一段央文中的每个字符统计其权值,建立哈夫曼树;(2) E:编码(Encoding )。
利用已建好的哈夫曼树,对每个字符进行编码。
(3) D:译码(Decoding )。
利用已建好的每个编码,对输入的一个由0、1组成的序列进行译码;(4) P:印代码文件(Print )。
将每个字符编的哈夫曼码和译码结果显示在终端上。
测试用例见题集p149。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1、问题描述简述题目要解决的问题是什么。
2、设计存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;3、调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4、经验和体会(包括对算法改进的设想)5、附源程序清单和运行结果。
源程序要加注释。
如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。
时间安排:1、第18周(6月28日至7月2日)完成。
2、7月2日08 : 30到计算中心检查程序、交课程设计报告、源程序( CD盘)。
指导教师签名:年月日系主任(或责任教师)签名:年月日目录1设计题目 (1)2问题描述 (1)3.1数据结构设计 (1)3.2主要算法设计 (3)3.3测试用例设计 (6)4调试报告 (7)5结束语 (7)六、课程设计参考资料 (8)附录 (9)F1源代码 (9)F2运行结果 (16)哈夫曼编码1设计题目哈夫曼编码2问题描述输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计题目哈夫曼编码学院计算机科学与技术专业计算机科学与技术班级姓名指导教师2010 年07 月02 日课程设计任务书学生姓名:拉巴珠久专业班级:计算机0806 指导教师:姚寒冰工作单位:计算机科学系题目: 哈夫曼编码初始条件:输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。
(1)I:初始化(Initialization)。
对输入的一段英文中的每个字符统计其权值,建立哈夫曼树;(2)E:编码(Encoding)。
利用已建好的哈夫曼树,对每个字符进行编码。
(3)D:译码(Decoding)。
利用已建好的每个编码,对输入的一个由0、1组成的序列进行译码;(4)P:印代码文件(Print)。
将每个字符编的哈夫曼码和译码结果显示在终端上。
测试用例见题集p149。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1、问题描述简述题目要解决的问题是什么。
2、设计存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;3、调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4、经验和体会(包括对算法改进的设想)5、附源程序清单和运行结果。
源程序要加注释。
如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。
时间安排:1、第18周(6月28日至7月2日)完成。
2、7月2 日08:30到计算中心检查程序、交课程设计报告、源程序(CD盘)。
指导教师签名:年月日系主任(或责任教师)签名:年月日目录1 设计题目....................... 错误!未定义书签。
2 问题描述....................... 错误!未定义书签。
3.1数据结构设计................ 错误!未定义书签。
3.2主要算法设计................ 错误!未定义书签。
3.3测试用例设计................ 错误!未定义书签。
4调试报告........................ 错误!未定义书签。
5结束语.......................... 错误!未定义书签。
六、课程设计参考资料............. 错误!未定义书签。
附录............................. 错误!未定义书签。
F1 源代码...................... 错误!未定义书签。
F2 运行结果.................... 错误!未定义书签。
哈夫曼编码1 设计题目哈夫曼编码2 问题描述输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。
(1)I:初始化(Initialization)。
对输入的一段英文中的每个字符统计其权值,建立哈夫曼树;(2)E:编码(Encoding)。
利用已建好的哈夫曼树,对每个字符进行编码。
(3)D:译码(Decoding)。
利用已建好的每个编码,对输入的一个由0、1组成的序列进行译码;(4)P:印代码文件(Print)。
将每个字符编的哈夫曼码和译码结果显示在终端上。
3.设计3.1数据结构设计抽象数据类型二叉树的定义如下:ADT BinaryTree{数据对象D:D是具有相同特性的数据元素的集合。
数据关系R:基本操作P:InitBiTree(&T);操作结果:构造空二叉树T。
DestroyBiTree(&T);初始条件:二叉树T存在。
操作结果:销毁二叉树T。
CreateBiTree(&T,definition);初始条件:definition给出二叉树T的定义。
操作结果:按definition构造二叉树T。
ClearBiTree(&T);初始条件:二叉树T存在。
操作结果:将二叉树T清为空树。
BiTreeEmpty(T);初始条件:二叉树T存在。
操作结果:若T为空二叉树。
则返回TRUE,否则FALSE。
BiTreeDepth(T);初始条件:二叉树T存在。
操作结果:返回T的深度。
Root(T);初始条件:二叉树T存在。
操作结果:返回T的根。
Value(T,e);初始条件:二叉树T的存在,e是T中某个结点。
操作结果:返回e的值。
Assign(T,&e,value);初始条件:二叉树T存在,e是T中某个结点。
操作结果:结点e赋值为value。
Parent(T,e);初始条件:二叉树T存在,e是T 中某个结点。
操作结果:若e是T的非根结点,则返回它的双亲,否则返回“空”。
DeleteChild(T,p,LR);初始条件:二叉树T存在,p指向T中某个结点,LR为0或1。
操作结果:根据LR为0或1,删除T中p所指结点的左或右子树。
InsertChild(T,p,LR,c);初始条件:二叉树的T存在,p指向T中某个结点,LR为0或1,非空二叉树c与T不相交且右子树为空。
操作结果:根据LR为0或1,插入c为T中p所指结点的左或右子树。
P所指结点的原有左或右子树则成为c的右子树。
}3.2主要算法设计程序中一共定义了一个结构体和三个函数如下:struct Huffman//定义指向结点的结构体{int weight;//权值int parent,lchild,rchild;//父亲结点和左右结点的位置};void select(Huffman * ht,int i,int & s1,int & s2){//选择权值较小的两个作为新的叶子结点,用于huffman的构造。
int j,k;k=s1;for(j=0;j<i+1;j++)if(s1!=j&&j!=s2&&ht[j].parent==0){s1=j;break;}for(j=0;j<i+1;j++)if(s2!=j&&s1!=j&&j!=k&&ht[j].parent==0){s2=j;break;}for(j=1;j<=i;j++)if(ht[j].weight<ht[s1].weight&&ht[j].parent==0)s1=j;if(s1==s2){for(j=0;j<i+1;j++)if(s2!=j&&s1!=j&&j!=k&&ht[j].parent==0){s2=j;break;}}for(j=0;j<=i;j++)if(ht[j].weight<ht[s2].weight&&ht[j].parent==0&&j!=s1) s2=j; }void Huffmancoding(Huffman * ht,char * *&hc,int k){//对haffman进行编码int m,s1=0,s2=0,start,c,i,f,j;char * cd;m=2*k-1;for(i=k;i<m;i++)//构建huffman树{select(ht,i-1,s1,s2);//调用selec t函数ht[s1].parent=i;ht[s2].parent=i;ht[i].lchild=s1;ht[i].rchild=s2;ht[i].weight=ht[s1].weight+ht[s2].weight;}for(i=0;i<=k-1;i++)//对每个叶子结点进行编码{cd=new char[k];hc[i]=" ";for(j=0;j<k;j++)cd[j]=' ';start=k-1;for(c=i,f=ht[i].parent;f!=0;c=f,f=ht[f].parent)if(ht[f].lchild==c) {cd[start--]='0';}else cd[start--]='1';hc[i]=&cd[start+1];}}void frequency(int * & w,char str[100],int * & c,int n,int & k){//涵数用于统计输入的字符的权w(出现的次数)。
int i,j,m;for(i=0;i<n;i++){if(i==0){c[0]=0;continue;}for(j=0;j<i;j++)if(str[j]==str[i]){c[i]=c[j];break;}if(j= =i){c[i]=++k;}}for(j=0;j<=k;j++){for(m=0;m<n;m++)if(c[m]= =j)w[j]++;}}3.3测试用例设计已知某系统在通信联络中只可能出现八种字符,其概率分别为0.05;0.29;0.07;0.08;0.14;0.23;0.03;0.11,试设计哈夫曼编码。
设权w=(5,29;7;8;14;23;3;11),n=8,则m=15,构造哈夫曼树。
如下图:哈夫曼编码:4调试报告程序调试:(1.)当01序列解码成字符串时,要注意是否与已得出的字符串的编码匹配,如果不匹配,就把它后面的01序列截掉,不进行解码。
(2.)&表示函数的参数是按地址传递的,当函数有多个返回值而无法用return实现时,通常使用这种。
比如:void frequency(int * & w,char str[100],int * & c,int n,int & k)5结束语经验和体会:通过一个星期的努力,总算把课程设计给完成了,这是一个坚苦而又漫长的过程。
是啊,读了那么多年的书,课程设计可是第一次。
看着劳动成果,很欣慰!通过这次课程设计之后我觉得自己对书上知识的掌握有很大的欠缺,看了题目都不知道怎么下手,一点头绪都没有,之后自己认真看了一遍书上的知识,查阅了一些网上资料,我能熟练掌握了二叉树,然后在此基础上掌握理解haffman树和编码,熟知了二叉树的性质。
可是这点小进展远远不够,这只是一个小小的开始,只能程序的大概轮廓可以写出来了。
但是有很多的细节和特殊情况没法写上去,例如:用于huffman的构造;用于对haffman进行编码;用于统计输入的字符的权w(出现的次数);实现这些的程序不知道该怎么写。
后来经过同学的帮助和指导慢慢地程序里用到的函数通过哪些语句来实现它,那些关键的函数怎样把它们有机结合起来等等,总之,在同学的多次指导下一个完整的程序写出来了,我也努力地去读懂它,发现自己隐约读懂了它!真正的收获更多是思想上的,让我认识程序的复杂,自己的微不足道,“学无止境”头一次认识的这么深刻,察觉自己的不足。