哈夫曼树课程设计报告

合集下载

哈夫曼实验报告实验目的(3篇)

哈夫曼实验报告实验目的(3篇)
5. 使用哈夫曼编码对实验数据进行压缩。
6. 对压缩数据进行解压缩,验证哈夫曼编码的正确性。
7. 分析实验结果,对比压缩前后数据的差异。
五、实验总结
通过本次实验,我们掌握了哈夫曼编码的原理和构造方法,学会了如何使用哈夫曼编码进行数据压缩和解压缩。实验结果表明,哈夫曼编码能够有效降低数据的冗余,提高数据压缩效果。同时,本次实验也加深了我们对数据结构中树形结构及其应用的理解,提高了算法设计和实现能力。在今后的学习和工作中,我们将继续探索哈夫曼编码及其应用,为相关领域的研究和发展贡献自己的力量。
二、实验内容
1. 理解哈夫曼编码的原理,掌握哈夫曼树的构造方法。
2. 编写程序实现哈夫曼树的构建、编码和解码过程。
3. 对给定的字符集进行哈夫曼编码,并分析编码后的结果。
4. 对编码后的数据进行解码,验证解码结果的正确性。
5. 比较哈夫曼编码与其他编码方法在数据压缩方面的性能。
三、实验原理
哈夫曼编码是一种基于字符频率的变长编码方法。在哈夫曼编码中,每个字符都被赋予一个唯一的编码,编码的长度与其在原始数据中的频率成反比。频率高的字符编码较短,频率低的字符编码较长。这样,哈夫曼编码在保证数据完整性的同时,实现了数据压缩的目的。
2. 能够编写程序实现哈夫曼编码和解码,提高编程能力。
3. 分析哈夫曼编码在不同场景下的压缩效果,为实际应用提供参考。
4. 了解哈夫曼编码在实际应用中的优势和局限性,为解决实际问题提供思路。
5. 培养实验操作能力,提高解决实际问题的能力。
通过本次实验,我们希望学员能够全面掌握哈夫曼编码的原理、构造方法及其在实际应用中的价值,为今后的学习和工作打下坚实的基础。
第2篇
一、实验目的
1. 理解哈夫曼编码的原理及其在数据压缩中的应用。

哈夫曼树课程设计报告

哈夫曼树课程设计报告

数据结构课程设计报告设计题目:哈夫曼树应用专业:软件工程班级:软件学生:学号:指导教师:罗作民 / 张翔起止时间: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)程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告一、实验目的本次实验的主要目的是深入理解和掌握哈夫曼树的数据结构及其相关算法,通过实际编程实现哈夫曼编码和解码的过程,提高对数据结构的应用能力和编程技能。

二、实验环境本次实验使用的编程语言为 Python,开发工具为 PyCharm。

操作系统为 Windows 10。

三、实验原理哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树。

其基本思想是通过构建一棵二叉树,使得权值较大的节点离根节点较近,权值较小的节点离根节点较远,从而实现带权路径长度的最小化。

哈夫曼编码是一种基于哈夫曼树的变长编码方式。

对于给定的字符集及其出现的频率,通过构建哈夫曼树,可以为每个字符生成唯一的编码,使得编码后的字符串总长度最短。

在构建哈夫曼树的过程中,首先将每个字符及其出现的频率作为一个独立的节点,然后按照频率从小到大的顺序进行合并,每次合并两个频率最小的节点,生成一个新的节点,其频率为两个子节点频率之和。

重复这个过程,直到所有节点合并为一个根节点,最终得到的二叉树即为哈夫曼树。

四、实验步骤1、定义节点类```pythonclass Node:def __init__(self, char, freq, left=None, right=None):selfchar = charselffreq = freqselfleft = leftselfright = rightdef __lt__(self, other):return selffreq < otherfreq```这个节点类包含了字符、频率以及左右子节点的信息,并实现了小于比较方法,以便在构建哈夫曼树时进行节点的排序。

2、构建哈夫曼树```pythondef build_huffman_tree(freq_dict):nodes = Node(char, freq) for char, freq in freq_dictitems()while len(nodes) > 1:nodessort()left = nodespop(0)right = nodespop(0)merged_freq = leftfreq + rightfreqnew_node = Node(None, merged_freq, left, right)nodesappend(new_node)return nodes0```该函数根据字符频率字典创建节点列表,然后不断合并频率最小的两个节点,直到只剩下一个节点,即哈夫曼树的根节点。

哈夫曼树课程设计报告书

哈夫曼树课程设计报告书
.专业.整理.
下载可编辑
工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。 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

哈夫曼树_实验报告

哈夫曼树_实验报告

一、实验目的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)

哈夫曼树课程设计报告(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语言哈夫曼树是广泛应用于数据压缩和编码的一种数据结构。

在计算机科学中,哈夫曼编码是一种无损的压缩算法,它基于使用较少的位数来表示频繁出现的字符,从而达到节省空间的目的。

本篇文章将围绕哈夫曼树的课程设计报告进行阐述,帮助读者更加深入地理解和应用哈夫曼树。

首先,我们需要了解哈夫曼树的基本概念和算法。

哈夫曼树是一种二叉树,它的每个节点都表示一个字符和它出现的频率。

哈夫曼树的算法主要是通过构建最小权重树来实现,即将输入的字符按照出现的频率进行排序,然后选择出现频率最小的两个字符,将它们合并成一个节点。

这个新节点的权重就是两个字符的权重之和。

继续将这个新节点与下一个最小频率字符继续合并,直到所有字符合并成一个节点。

最终形成的二叉树就是哈夫曼树。

接下来,我们需要学习如何在C语言中实现哈夫曼树。

在实现过程中,我们需要定义一个结构体来表示哈夫曼树节点。

这个结构体包含两个成员:字符和出现的频率。

同时,我们需要定义一个优先队列来存储字符节点和它们的权重。

在优先队列中,我们需要实现一些基本操作,比如插入、删除和取出队首元素等等。

通过这些操作,我们就可以按照字符频率构建出哈夫曼树。

最后,我们需要实现哈夫曼编码的功能。

在哈夫曼编码中,我们需要定义一个数组来存储每个字符的编码。

这个数组的索引是字符的ASCII码,它的值是该字符的哈夫曼编码。

在对输入字符串进行编码时,我们从哈夫曼树的根节点开始,按照左右子树的方向进行编码。

当遇到叶子节点时,我们就将编码添加到输出字符串中。

最终,我们就可以完成对字符串的压缩和解压。

综上所述,哈夫曼树是一种非常有用的数据结构,它在数据压缩和加密领域都有广泛的应用。

通过本篇文章的介绍,希望读者们能够更加深入地理解哈夫曼树的基本概念和实现方法。

在学习过程中,读者们也可以尝试自己动手实现哈夫曼树,并应用到实际的项目中,提高自己的编程能力。

哈夫曼树的课程设计报告

哈夫曼树的课程设计报告

数据结构与算法课程设计报告书题目:哈夫曼编码/译码器班级:学号:1109121105姓名:田欢指导教师:龚丹周期:2011-12-19至2011-12-23成绩:年月日一、课程设计的目的与要求(一)课程设计目的与任务(参考已发文档自行编辑,但不少于100字)设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。

利用哈夫曼树编码问题基本原理的应用,撑握对树的不同存储结构的定义和算法描述。

学会构造哈夫曼树和哈夫曼编码等主要算法。

(二)题目要求1) 将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中)2) 分别采用动态和静态存储结构3) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;4) 编码:利用建好的哈夫曼树生成哈夫曼编码;5) 输出编码;6) 设字符集及频度如下表:字符空格A B C D E F G H I J K L M频度186 64 13 22 32 103 21 15 47 57 1 5 32 20字符N O P Q R S T U V W X Y Z频度57 63 15 1 48 51 80 23 8 18 1 16 1二、设计正文1 系统分析(1)定义一个变量名为HTNode的结构体,用该结构体中的char data、int weight、int parent、int lchild、int rchild分别表示哈夫曼树中每个结点的权值、权重、双亲结点、左孩子、右孩子,再定义一个HTNode类型的数组ht[30]存放哈夫曼树;另外定义一个变量名为HCode的结构体,采用HCode类型变量的cd[start]~cd[n]存放当前结点的哈夫曼编码、最后定义一个HCode类型的数组hcd[30]的数组用于存放当前叶子结点ht[i]的哈夫曼编码。

(2)编写CodeInput(n,ht)函数并在函数中设置一个for(i=0;n;++)循环,首先输入n个字符,再利用函数中的for(i=0;<n;++)循环实现对这n个字符的权值的输入。

数据结构 哈夫曼树编码译码 课程设计 实验报告

数据结构 哈夫曼树编码译码 课程设计 实验报告

数据结构课程设计设计题目:哈夫曼树编码译码目录第一章需求分析 (1)第二章设计要求 (1)第三章概要设计 (2)(1)其主要流程图如图1-1所示。

(3)(2)设计包含的几个方面 (4)第四章详细设计 (4)(1)①哈夫曼树的存储结构描述为: (4)(2)哈弗曼编码 (5)(3)哈弗曼译码 (7)(4)主函数 (8)(5)显示部分源程序: (8)第五章调试结果 (10)第六章心得体会 (12)第七章参考文献 (12)附录: (12)在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视,哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。

哈夫曼编码是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。

哈弗曼编码使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。

这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。

哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。

树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是哈夫曼编码。

哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。

第二章设计要求对输入的一串电文字符实现哈夫曼编码,再对哈夫曼编码生成的代码串进行译码,输出电文字符串。

通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。

电报通信是传递文字的二进制码形式的字符串。

但在信息传递时,总希望总长度能尽可能短,即采用最短码。

假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为∑WiLi。

哈夫曼树实验报告

哈夫曼树实验报告

哈夫曼树实验报告一、需求分析(1)输入输出形式输入数组的组数n: 整形变量组数(回车)请依次输入n组权值与字符, 中间用空格隔开。

如“2 a”:按右提示格式输入(回车)请输入待编译文本: 随机输入字符(回车)输出: 编译出的代码请输入待编译代码: 随机输入一串代码(回车)(2)输出: 编译出的代码(3)程序功能1. 用C语言实现二叉树的说明2. 输入n个权值, 并生成n个二叉树3. 对n个二叉树逐步生成Huffman树4. 对Huffman树的每个叶子结点生成编码5.用哈夫曼树编码。

6.解码哈夫曼编码。

(4)测试用例设计Example1: 输入325 a15 b60 cabbacc010*******输出010*******abbaccExample2: 输入510 a20 b30 c20 d10 eababcde10000100001101101输出10000100001101101ababcde二、概要设计1.根据给定的n个权值(w1, w2, …, wn)构成n棵二叉树的集合F={T1, T2, …, Tn}, 其中每棵二叉树Ti中只有一个带树为Ti的根结点在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树, 且置其根结点的权值为其左右子树权值之和3.在F中删除这两棵树, 同时将新得到的二叉树加入F中4.重复2, 3, 直到F只含一棵树为止三、 5.将给定的字符串通过程序编码成哈夫曼编码, 并打印结果在屏幕上。

四、 6.翻译给定的哈夫曼编码变成可读字符串, 并将结果打印在屏幕上。

五、详细设计四、调试分析(1)编译代码、运行代码所遇到的问题及其解决办法问题1: 编译代码过程中有遇到循环体的循环次数不对, 导致二叉树生成得不对解决办法:通过小数字的演算, 检验循环, 再进行更改(2)算法的时空分析(3)心得体会五、用户使用说明如上图所示, 依次输入组数、权值及全值所对应字符。

再根据用户自身需求输入需编译的文本及代码。

哈夫曼树实验报告

哈夫曼树实验报告

哈夫曼树实验报告一、实验目的1.理解哈夫曼树的概念和实现原理;2.掌握使用哈夫曼树进行编码和解码的方法;3.熟悉哈夫曼树在数据压缩中的应用。

二、实验原理哈夫曼树是一种用于数据压缩的树形结构,通过将出现频率较高的数据项用较短的编码表示,从而达到压缩数据的目的。

哈夫曼树的构建过程如下:1.统计字符出现的频率,并按照频率从小到大排序;2.将频率最低的两个字符合并为一个节点,节点的频率为两个字符的频率之和;3.将新节点插入频率表,并将频率表重新排序;4.重复步骤2和3,直到频率表中只剩下一个节点,该节点即为哈夫曼树的根节点。

三、实验步骤1.统计输入的字符序列中每个字符出现的频率;2.根据频率构建哈夫曼树;3.根据哈夫曼树生成字符的编码表;4.将输入的字符序列编码为哈夫曼编码;5.根据哈夫曼树和编码表,解码得到原始字符序列。

四、实验结果以字符序列"abacabad"为例进行实验:1.统计字符频率的结果为:a-4次,b-2次,c-1次,d-1次;```a-4/\b-2c-1/\d-1空节点```3.根据哈夫曼树生成的编码表为:a-0,b-10,c-110,d-111;5. 根据哈夫曼树和编码表进行解码得到原始字符序列:"abacabad"。

五、实验总结通过本次实验,我深入了解了哈夫曼树的原理和实现方法,掌握了使用哈夫曼树进行字符编码和解码的过程。

哈夫曼树在数据压缩中的应用非常广泛,能够有效地减小数据的存储空间,提高数据传输效率。

在实际应用中,我们可以根据不同字符出现的频率构建不同的哈夫曼树,从而实现更高效的数据压缩和解压缩算法。

huffman哈夫曼树编码译码课程设计报告

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。

哈夫曼树编码课程设计实验报告

哈夫曼树编码课程设计实验报告

四、综合设计(课程设计)摘要:在这次课程设计中,所进行的实验是:哈夫曼编码和编译器。

对哈夫曼树进行建立,由节点的权值建立最小二叉树,哈夫曼树haftree,并由所建立的哈夫曼树进行编码,求出各个节点的编码。

在由所求的哈夫曼树,输入一段二进制电文,能够输出那所建立的哈夫曼树中的节点。

建立的haftree用图形化表示出来。

在整个代码实现中,窗体的实现,功能的完善,哈夫曼树的建立,哈夫曼树的编码,遇到了许多难题,haftree对象数组的分配空间,节点的属性等都比较困难。

在整个过程中,用的是C#语言,包的应用,字符串数组的空间分配,在计算每个字符的权值时,用的是sizeOf()检索整个字符串,计算字符的权值,建立字符出现频度的表格,根据表格中每个字符频度建立起哈夫曼树。

从根节点出发检索每个节点的左右孩子,如果是左孩子遍历左边,路径为0,然后左孩子为根节点;如果是右孩子,遍历右孩子,路径为1,然后右孩子为根节点。

在重新上述方法,直到所有的节点都遍历完,每个节点的编码就确定后输出来。

在译码过程中,由所输入的二进制电文,根据所建立的哈夫曼树,如果是0走左边,如果是1,走右边,直到节点的左右孩子为空时,输出给节点的信息,在回到根节点重新遍历后面的二进制电文,直到所有电文都遍历完为止,输出所有从电文中译码出来的信息。

关键词:编译器;频度;译码五、综合设计(课程设计)Abstract:In this design, the experiment was : Huffman coding and compiler. The Huffman tree to establish, by the node weights to establish a minimum of two fork tree, Huffman tree haftree, and by the Huffman tree coding, and every node coding. By the Huffman tree, enter a binary message, can output the set up by the Huffman tree nodes. Establishment of haftree graphical representation. In the implementation of the code, the realization form, function perfect, Huffman tree is established, Huffman coding tree, encountered a lot of problems, an array of haftree objects allocated space, node attributes are difficult. Throughout the process, using the C# language, the application package, an array of strings in the spatial distribution, calculated for each weight of characters, using sizeOf to retrieve the entire string, calculating the weight of characters, establish character appearance frequency of form, form the basis of each character frequency established Huffman tree. Starting from the root node to retrieve each node around children, if children left traverse left, path 0, then left the child as the root node; if it is right child, traversing the right path for children, 1 children for the root node, then the right. In the new method described above, until all of the node traversal finished, each node is determined after the output coding.In the decoding process, by the input binary message, according to the established Huffman tree, if it is 0 the left, if it is 1, go right, until the left and right child node is empty, the output to the node information, in the back of the root node to traverse behind a binary message, until all message traversal finished so far, the output from all the message decoding of information.Keywords:compiler;frequency;decoding目录摘要 ................................................................................. 错误!未定义书签。

哈弗曼树实验报告(3篇)

哈弗曼树实验报告(3篇)

一、实验目的1. 理解并掌握哈弗曼树的构建原理。

2. 学会使用哈弗曼树进行数据编码和解码。

3. 了解哈弗曼编码在数据压缩中的应用。

二、实验原理哈弗曼树(Huffman Tree)是一种带权路径长度最短的二叉树,用于数据压缩。

其基本原理是:将待编码的字符集合按照出现频率从高到低排序,构造一棵二叉树,使得叶子节点代表字符,内部节点代表编码,权值代表字符出现的频率。

通过这棵树,可以生成每个字符的编码,使得编码的平均长度最小。

三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019四、实验步骤1. 构建哈弗曼树(1)创建一个结构体`HuffmanNode`,包含字符、权值、左子树和右子树指针。

```cppstruct HuffmanNode {char data;int weight;HuffmanNode left;HuffmanNode right;};(2)定义一个函数`HuffmanTree()`,用于创建哈弗曼树。

```cppHuffmanNode HuffmanTree(std::vector<char>& chars, std::vector<int>& weights) {// 创建初始二叉树std::vector<HuffmanNode> trees;for (int i = 0; i < chars.size(); ++i) {trees.push_back(new HuffmanNode{chars[i], weights[i], nullptr, nullptr});}// 构建哈弗曼树while (trees.size() > 1) {// 选择两个权值最小的节点auto it1 = std::min_element(trees.begin(), trees.end(),[](HuffmanNode a, HuffmanNode b) {return a->weight < b->weight;});auto it2 = std::next(it1);HuffmanNode parent = new HuffmanNode{0, it1->weight + it2->weight, it1, it2};// 删除两个子节点trees.erase(it1);trees.erase(it2);// 将父节点添加到二叉树集合中trees.push_back(parent);}// 返回哈弗曼树根节点return trees[0];}```2. 生成哈弗曼编码(1)定义一个函数`GenerateCodes()`,用于生成哈弗曼编码。

哈夫曼树的课程设计

哈夫曼树的课程设计

哈夫曼树的课程设计一、课程目标知识目标:1. 理解哈夫曼树的基本概念、性质与应用;2. 学会构建哈夫曼树及计算哈夫曼编码;3. 掌握哈夫曼树在实际问题中的应用。

技能目标:1. 能够运用哈夫曼树解决数据压缩问题;2. 能够运用编程实现哈夫曼树的构建及编码;3. 能够运用哈夫曼树优化算法,提高问题解决效率。

情感态度价值观目标:1. 培养学生主动探究、积极思考的学习态度;2. 培养学生团队协作、共同解决问题的合作精神;3. 增强学生对数据结构与算法在实际应用中的价值认识。

本课程针对高中年级学生,结合学科特点,注重理论与实践相结合。

在教学过程中,充分考虑学生的认知水平、兴趣和需求,以实际问题为引导,激发学生的学习兴趣。

通过本课程的学习,使学生能够掌握哈夫曼树的相关知识,提高编程能力和问题解决能力,同时培养学生的团队协作精神和价值观。

课程目标具体、可衡量,便于教学设计和评估。

二、教学内容1. 哈夫曼树基本概念:介绍哈夫曼树的定义、性质以及相关术语,如路径长度、权值等;2. 哈夫曼树的构建:讲解哈夫曼树的构建过程,包括贪心算法的应用;3. 哈夫曼编码:介绍哈夫曼编码的原理,学会计算哈夫曼编码;4. 哈夫曼树在实际问题中的应用:分析哈夫曼树在数据压缩、图像处理等领域的应用;5. 编程实践:结合教材内容,运用编程语言实现哈夫曼树的构建、哈夫曼编码及数据压缩;6. 案例分析:选取典型实例,分析哈夫曼树优化算法在解决问题中的作用。

教学内容按照以下进度安排:1. 第一周:哈夫曼树基本概念及性质;2. 第二周:哈夫曼树的构建方法;3. 第三周:哈夫曼编码的计算方法;4. 第四周:哈夫曼树在实际问题中的应用;5. 第五周:编程实践及案例分析。

教学内容与教材紧密关联,注重科学性和系统性,旨在帮助学生掌握哈夫曼树的相关知识,提高实际应用能力。

三、教学方法本课程采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:教师通过生动的语言、形象的表达,讲解哈夫曼树的基本概念、性质和构建方法,使学生对知识点有系统的认识。

哈夫曼树课程设计报告

哈夫曼树课程设计报告

数据结构课程设计报告设计题目:哈夫曼树应用专业:软件工程班级:软件学生:学号:指导教师:罗作民 / 张翔起止时间: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 Tree)是一种经典的数据结构,常被用于数据压缩和编码中。

它是一种特殊的二叉树,具有最优的前缀编码性质。

本文将详细介绍哈夫曼树的定义、构建方法以及应用场景。

二、哈夫曼树的定义哈夫曼树是一种满足以下条件的二叉树:1. 所有的叶子节点都带有权值;2. 没有度为1的节点;3. 任意两个叶子节点的路径长度不相同。

三、哈夫曼树的构建方法1. 构建哈夫曼树的基本思想是将权值较小的节点放在较低的层次,权值较大的节点放在较高的层次;2. 首先,根据给定的权值集合,将每一个权值看做一个独立的节点;3. 然后,选择两个权值最小的节点,将它们合并为一个新节点,并将新节点的权值设置为这两个节点的权值之和;4. 重复上述步骤,直到只剩下一个节点,即为哈夫曼树的根节点。

四、哈夫曼编码哈夫曼编码是一种变长编码方式,用于将字符转换为二进制编码。

它的特点是没有编码冗余,即每一个字符的编码都不是其他字符编码的前缀。

这种编码方式可以大幅度减小数据的存储空间和传输带宽。

五、哈夫曼树的应用场景1. 数据压缩:哈夫曼树可以根据字符浮现的频率构建最优的编码方式,从而实现数据的高效压缩;2. 文件压缩:将文件中的字符转换为哈夫曼编码,可以大幅度减小文件的大小;3. 图象压缩:将图象中的像素值转换为哈夫曼编码,可以实现图象的无损压缩;4. 视频压缩:将视频中的帧数据转换为哈夫曼编码,可以减小视频文件的大小。

六、哈夫曼树的时间复杂度和空间复杂度1. 构建哈夫曼树的时间复杂度为O(nlogn),其中n为权值的个数;2. 哈夫曼编码的时间复杂度为O(n),其中n为字符的个数;3. 哈夫曼树的空间复杂度为O(n),其中n为权值的个数。

七、总结哈夫曼树是一种重要的数据结构,具有广泛的应用场景。

通过构建最优的编码方式,可以实现高效的数据压缩和编码。

掌握哈夫曼树的定义、构建方法以及应用场景,对于数据结构课程的学习和实践具有重要意义。

c哈夫曼树课程设计

c哈夫曼树课程设计

c哈夫曼树课程设计一、教学目标本课程的目标是让学生掌握哈夫曼编码的基本原理和构建哈夫曼树的方法。

通过本课程的学习,学生应能理解哈夫曼编码的优势和应用场景,掌握构建哈夫曼树的基本步骤,并能运用哈夫曼编码解决实际问题。

具体来说,知识目标包括:1.了解哈夫曼编码的原理和特点。

2.掌握构建哈夫曼树的方法和步骤。

3.理解哈夫曼编码在信息传输和数据压缩中的应用。

技能目标包括:1.能够运用哈夫曼编码对字符串进行编码和解码。

2.能够构建哈夫曼树并计算编码后的字符串的冗余度。

3.能够分析给定字符串的频率分布,并构建相应的哈夫曼树。

情感态度价值观目标包括:1.培养学生的逻辑思维能力和问题解决能力。

2.培养学生对信息传输和数据压缩的兴趣和好奇心。

3.培养学生对算法优化和创新思维的重视。

二、教学内容本课程的教学内容主要包括哈夫曼编码的基本原理、构建哈夫曼树的方法和应用。

具体的教学大纲如下:1.第一章:哈夫曼编码的基本原理–哈夫曼编码的定义和特点–哈夫曼编码的构建步骤2.第二章:构建哈夫曼树的方法–哈夫曼树的构建算法–哈夫曼树的性质和应用3.第三章:哈夫曼编码的应用–信息传输中的哈夫曼编码–数据压缩中的哈夫曼编码4.第四章:案例分析和实验–字符串编码和解码的案例分析–构建哈夫曼树并计算冗余度的实验三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法相结合的方式。

具体包括:1.讲授法:通过讲解哈夫曼编码的基本原理和构建哈夫曼树的方法,引导学生理解和掌握相关知识。

2.讨论法:通过小组讨论和课堂讨论,让学生积极参与进来,提出问题并解决问题。

3.案例分析法:通过分析实际案例,让学生将理论知识应用到实际问题中,提高问题解决能力。

4.实验法:通过实验操作,让学生亲手构建哈夫曼树并计算冗余度,加深对知识的理解和记忆。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:选择一本与哈夫曼编码和数据压缩相关的教材,作为学生学习的基础资源。

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告一、实验目的本次实验的主要目的是深入理解和掌握哈夫曼树的数据结构及其相关算法,并通过实际编程实现来提高对数据结构的应用能力和编程技能。

二、实验环境本次实验使用的编程环境为具体编程语言名称,操作系统为具体操作系统名称。

三、实验原理哈夫曼树,又称最优二叉树,是一种带权路径长度最短的二叉树。

其基本原理是通过构建一棵二叉树,使得权值较大的节点距离根节点较近,权值较小的节点距离根节点较远,从而达到带权路径长度最小的目的。

在构建哈夫曼树的过程中,首先需要将所有的节点按照权值从小到大进行排序。

然后,选取权值最小的两个节点作为左右子树,构建一个新的父节点,该父节点的权值为左右子节点权值之和。

重复这个过程,直到所有的节点都被构建到哈夫曼树中。

哈夫曼编码是基于哈夫曼树的一种编码方式。

对于每个叶子节点,从根节点到该叶子节点的路径上,向左的分支编码为 0,向右的分支编码为 1,这样就可以得到每个叶子节点的哈夫曼编码。

四、实验步骤1、定义节点结构体```ctypedef struct HuffmanNode {char data;int weight;struct HuffmanNode left;struct HuffmanNode right;} HuffmanNode;```2、实现节点排序函数```cvoid sortNodes(HuffmanNode nodes, int n) {for (int i = 0; i < n 1; i++){for (int j = 0; j < n i 1; j++){if (nodesj>weight > nodesj + 1>weight) {HuffmanNode temp = nodesj;nodesj = nodesj + 1;nodesj + 1 = temp;}}}}```3、构建哈夫曼树```cHuffmanNode buildHuffmanTree(HuffmanNode nodes, int n) {while (n > 1) {sortNodes(nodes, n);HuffmanNode left = nodes0;HuffmanNode right = nodes1;HuffmanNode parent =(HuffmanNode )malloc(sizeof(HuffmanNode));parent>data ='\0';parent>weight = left>weight + right>weight;parent>left = left;parent>right = right;nodes0 = parent;nodes1 = nodesn 1;n;}return nodes0;}```4、生成哈夫曼编码```cvoid generateHuffmanCodes(HuffmanNode root, int codes, int index) {if (root>left) {codesindex = 0;generateHuffmanCodes(root>left, codes, index + 1);}if (root>right) {codesindex = 1;generateHuffmanCodes(root>right, codes, index + 1);}if (!root>left &&!root>right) {printf("%c: ", root>data);for (int i = 0; i < index; i++){printf("%d", codesi);}printf("\n");}}```5、主函数```cint main(){HuffmanNode nodes5 ={(HuffmanNode )malloc(sizeof(HuffmanNode)),(HuffmanNode )malloc(sizeof(HuffmanNode)),(HuffmanNode )malloc(sizeof(HuffmanNode)),(HuffmanNode )malloc(sizeof(HuffmanNode)),(HuffmanNode )malloc(sizeof(HuffmanNode))};nodes0>data ='A';nodes0>weight = 5;nodes1>data ='B';nodes1>weight = 9;nodes2>data ='C';nodes2>weight = 12;nodes3>data ='D';nodes3>weight = 13;nodes4>data ='E';nodes4>weight = 16;HuffmanNode root = buildHuffmanTree(nodes, 5);int codes100;generateHuffmanCodes(root, codes, 0);return 0;}```五、实验结果与分析通过运行上述程序,得到了每个字符的哈夫曼编码:A: 00B: 01C: 10D: 110E: 111分析实验结果可以发现,权值较小的字符A 和B 对应的编码较短,而权值较大的字符D 和E 对应的编码较长。

哈夫曼树实验报告

哈夫曼树实验报告

一、实验目的1. 理解哈夫曼树的基本概念和构造方法。

2. 掌握哈夫曼编码的原理和实现过程。

3. 通过实验加深对数据结构中树型结构应用的理解。

二、实验原理哈夫曼树(Huffman Tree)是一种带权重的二叉树,用于实现哈夫曼编码。

其基本思想是:将字符按照在数据集中出现的频率进行排序,然后选取两个最小频率的字符合并成一个新节点,其频率为两个字符频率之和,重复此过程,直到只剩下一个节点,即为哈夫曼树的根节点。

哈夫曼编码是一种基于哈夫曼树的编码方法,其原理是将每个字符映射到一个唯一的二进制序列,序列的长度与字符在数据集中出现的频率成反比。

频率越高,编码的长度越短,从而提高信息传输的效率。

三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019四、实验步骤1. 初始化(1)从数据文件中读取字符及其频率。

(2)构建一个优先队列(最小堆),将字符和频率存储在队列中。

2. 构建哈夫曼树(1)从优先队列中取出两个频率最小的节点,合并成一个新节点,其频率为两个节点频率之和。

(2)将新节点插入优先队列中。

(3)重复步骤(1)和(2),直到优先队列中只剩下一个节点,即为哈夫曼树的根节点。

3. 哈夫曼编码(1)遍历哈夫曼树,从根节点到叶子节点的路径上,左子树表示0,右子树表示1。

(2)将每个叶子节点的字符和对应的编码存储在哈夫曼编码表中。

4. 编码(1)读取待编码的文本。

(2)根据哈夫曼编码表,将文本中的每个字符映射到对应的编码。

(3)将编码序列写入文件。

5. 译码(1)读取编码文件。

(2)从哈夫曼树的根节点开始,根据编码序列的每一位,判断是左子树还是右子树。

(3)当到达叶子节点时,输出对应的字符。

(4)重复步骤(2)和(3),直到编码序列结束。

五、实验结果与分析1. 实验结果(1)成功构建了哈夫曼树,并生成了哈夫曼编码表。

(2)对给定的文本进行了编码和译码,验证了编码的正确性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计题目:哈夫曼编码器院系:专业班级:学号:学生姓名:指导教师: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中。

各个功能数据输出存储位置(如表1所示)表1:各个功能数据输出存储位置表6.测试数据(1)正确的输入:1>输入主菜单项中的英文字母I(i),E(e),D(d),P(p),Q(q)输出结果:进入所选的功能界面2>输入子菜单项中的数字1,2,3,(4)输出结果:执行所选的功能(2)含有错误的输入:1>输入除了主菜单项中的英文字母I(i),E(e),D(d),P(p),Q(q)输出结果:<您的输入有误,请重新输入:>2>输入除了子菜单项中的数字1,2,3,(4)输出结果:<您的输入有误,请重新输入:>7.程序说明(1)程序中数据类型的定义:用到三组结构体,分别是哈夫曼树的动态数组存储结构*HuffmanTree,哈夫曼编码表的存储结构HuffmanCode,字符结点的动态数组存储结构wElem 以及哈夫曼树类定义class Huffman。

(2)主程序的流程图:用户从主菜单中选择所要进行的操作,如果输入选项错误则提示重新输入选项,否则进入选中的操作项(如图1所示)。

图1:主程序流程图(3)各程序模块之间的层次(调用)关系:主函数main()调用初始化,编码,译码,打印二进制编码,打印哈夫曼树这五个子函数;进入初始化功能后调用手动输入,文本读入,默认文本这三个函数;进入编码功能后调用手动编码,文本读入编码这两个函数;进入译码功能后调用手动译码,文本读入译码这两个函数(如图2所示)。

图2::各程序模块之间的层次(调用)关系(4)默认的哈夫曼树:空格以及字母A—Z频度分别为186,64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1建立一棵默认的哈夫曼树(如图3所示)。

图3:默认的哈夫曼树二、详细设计1、哈夫曼树存储及类的定义:#include <string>#include <iostream>#include <fstream>#include <iomanip>#include <conio.h>typedef struct //哈夫曼树的存储结构{int weight; //权值char HTch; //字符int parent,lchild,rchild; //双亲,左孩子,右孩子}HTNode,*HuffmanTree; //动态数组存储哈夫曼树typedef struct //哈夫曼编码表的存储结构{char ch; //字符char* hufCh; //二进制码}HuffmanCode; //动态数组存储哈夫曼编码表typedef struct //字符结点{char ch; //字符int wt; //字符权值}wElem; //动态分配数组存储读入字符与权值class Huffman{public:Huffman(){}; //构造函数~Huffman(){}; //析构函数void Initialization(HuffmanTree &HT,HuffmanCode *HC,int &n);//初始化,手动void Initialization(HuffmanTree &HT,HuffmanCode *HC,int &n,int v);//初始化,标准文件void Initialization(HuffmanTree &HT,HuffmanCode *HC,char*InitFile,int &n);//初始化,统计void EnCoding(HuffmanCode *HC,int hufnum); //手动编码void EnCoding(HuffmanCode *HC,char*EnCodeFile); //文件读入编码void Print(char *);//打印二进制编码void Treeprinting( HTNode T,HuffmanTree HT,int n );//打印哈夫曼树};2、哈夫曼树的基本操作://手动输入字符与权值并初始化void Huffman::Initialization(HuffmanTree &HT,HuffmanCode *HC,int &n)//哈夫曼树对象,编码对象,字符数//从文件读入标准哈夫曼树并初始化void Huffman::Initialization(HuffmanTree &HT,HuffmanCode *HC,int &n,int v)//哈夫曼树对象,编码对象,字符数,区分功能参数//从文件中统计字符与权值,构造哈弗曼树void Huffman::Initialization(HuffmanTree &HT,HuffmanCode *HC,char*InitFile,int &n)//哈夫曼树对象,编码对象,文件名,字符数//编码函数,对用户输入的文件的正文进行编码,然后将结果存入文件WriteCodeFile.txt中void Huffman::EnCoding(HuffmanCode *HC,int hufnum)//编码数组对象,字符数//编码函数,从文件读取void Huffman::EnCoding(HuffmanCode *HC,char*EnCodeFile)//编码数组对象,文件名//译码函数,对文件CodeFile中的代码进行译码,结果存入文件ReadTextFile.txt中void Huffman::DeCoding(HuffmanTree HT,HuffmanCode *HC,char*DeCodeFile,int n)//哈夫曼树对象,编码对象,文件名,字符数//译码函数,手动输入void Huffman::DeCoding(HuffmanTree HT,HuffmanCode *HC,int n)//哈夫曼树对象,编码对象,字符数//打印函数,将文件CodePrint.txt中的内容以每行个代码显示在屏幕上void Huffman::Print(char* cfileName) //文件名//打印哈夫曼树void coprint(HuffmanTree start,HuffmanTree HT) //哈夫曼树对象,哈夫曼树对象其中部分操作的伪代码如下:(1)从文件读入标准哈夫曼树并初始化void Huffman::Initialization(HuffmanTree &HT,HuffmanCode *HC,int &n,int v)//哈夫曼树对象,编码对象,字符数,区分功能参数{定义一个动态数组存放空格和26个英文字母,把字符串" ABCDEFGHIJKLMNOPQRSTUVWXYZ"读入文件"CharFile.txt"while(charRead.get(inbuf)){w[j].ch=inbuf;w[j].wt=cw[j];j++;}//w存放n字符及其权值(从0号单元开始),构造哈夫曼树HT,并求出n个字符的哈夫曼编码HC.int i,m,ww=0; //n:字符数 m:树结点数int s1,s2;HuffmanTree p; //定义指针变量pif(n<=1) return; //小于2个字符,结束m=2*n-1; //n个叶子,2*n-1个结点HT=new HTNode[(m+1)*sizeof(HTNode)];HT[0].parent=-1;HT[0].lchild=-1;HT[0].rchild=-1;HT[0].weight=0;for(p=HT+1,i=1;i<=n;i++,p++,ww++)//初始化n个叶子结点(即n个字符){p->weight=w[ww].wt;p->HTch=w[ww].ch;p->parent=p->lchild=p->rchild=0;}//跳出循环时i=n+1;for(;i<=m;i++,++p)//初始化叶子结点之外的其它所有结点{p->weight=0;p->HTch='#';p->parent=p->lchild=p->rchild=0;}for(i=n+1;i<=m;i++)//建立哈夫曼树{Select(HT,i-1,s1,s2);//在HT数组的至i-1个结点中选择parent为且权值weight最小的两个结点,其序号分别为S1和S2;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;}char *cd=new char[n];//分配编码的存储空间cd[n-1]='\0';//编码结束符int c,f,start;for(i=1;i<=n;i++)//逐个字符求哈夫曼编码{start=n-1;for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent){if(HT[f].lchild==c)cd[--start]='0';elsecd[--start]='1';}HC[i].ch=w[i-1].ch;//复制字符HC[i].hufCh=new char [(n-start)*sizeof(char)];//为第i个字符编码分配空间strcpy(HC[i].hufCh,&cd[start]);//从cd复制编码(串)到HC}//向屏幕输出哈夫曼编码,并把编码保存在文件hfmCode.txt中;}(2)编码函数,从文件读取void Huffman::EnCoding(HuffmanCode *HC,char*EnCodeFile)//编码数组对象,文件名{对文件进行编码,并将编码存于文件ReadCodeFile.txt中while(ufileRead.get(charInbuf)){for(int k=1;k<=27;k++){if(charInbuf==HC[k].ch){codeWrite<<HC[k].hufCh;break;}}}}3、主函数:#include "Huffman.cpp"//主函数void main(){ int current_n=27; //全局变量,字符数char c; //功能选择int hufnum=27; //默认字符数HuffmanTree HT; //哈夫曼树对象HuffmanCode *HC=new HuffmanCode[(hufnum+1)*sizeof(HuffmanCode)];//分配n 个 //字符编码的头指针向while(1){//主菜单cout<<"请按顺序选择要实现的功能<I,E,D,P,T>:";int k=1; Huffman hf; //类对象while(k){//将小写转化为大写}switch(c){ case'I': //进入初始化选择界面{//选择初始化方式后,进入子菜单switch(c){case ‘1’:{hf.Initialization(HT,HC,current_n);break; }//手动初始化case ‘2’:{//输入需要初始化的文件名(需包含后缀名.txt)建立哈夫曼树;//建立哈夫曼树,并把哈夫曼树存放在ReadhfmTree.txt中hf.Initialization(HT,HC,buf,current_n); break;//从文件读入数据初始化}case ‘3’: {hf.Initialization(HT,HC,current_n,0); //标准初始化 }case ‘4’: break;}break;}case'E': //进入编码选择界面{//选择字符序列读入方式后进入子菜单switch(c){case '1':{hf.EnCoding(HC,hufnum); break; //手动编码 }case '2':{ //输入需要的文件名(需包含后缀名.txt) 进行编码hf.EnCoding(HC,buf); break; //文件读入编码}case '3': break;}break;}case'P': //进入打印二进制编码界面{ hf.Print("ReadCodeFile.txt"); break;}case'T': //进入打印哈夫曼树界面{ hf.Treeprinting(HT[2*current_n-1],HT,current_n);break;} case'Q':exit(-1); //退出default:exit(-1);}}}三、系统调试与测试1、调试过程中遇到的问题及解决办法:(1)逐个手动输入字符和权值进行编码,若数据太大效率太低。

相关文档
最新文档