数据结构哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
一、实验目的:
通过哈夫曼编、译码算法的实现,巩固二叉树及哈夫曼树相关知识的理解掌握,训练学生运用所学知识,解决实际问题的能力。
二、实验内容:
已知每一个字符出现的频率,构造哈夫曼树,并设计哈夫曼编码。
1、从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。
2、打印每一个字符对应的哈夫曼编码。
3、对从终端读入的字符串进行编码,并显示编码结果。
4、对从终端读入的编码串进行译码,并显示译码结果。
三、实验方案设计:
(对基本数据类型定义要有注释说明,解决问题的算法思想描述要完整,算法结构和程序功能模块之间的逻辑调用关系要清晰,关键算法要有相应的流程图,对算法的时间复杂度要进行分析)
1、算法思想:
(1)构造两个结构体分别存储结点的字符及权值、哈夫曼编码值:
(2)读取前n个结点的字符及权值,建立哈夫曼树:
(3)根据哈夫曼树求出哈夫曼编码:
2、算法时间复杂度:
(1)建立哈夫曼树时进行n到1次合并,产生n到1个新结点,并选出两个权值最小的根结点:O(n²);
(2)根据哈夫曼树求出哈夫曼编码:O(n²)。
(3)读入电文,根据哈夫曼树译码:O(n)。
四、该程序的功能和运行结果:
(至少有三种不同的测试数据和相应的运行结果,充分体现该程序的鲁棒性)
1、输入字符A,B,C,D,E,F及其相应权值16、1
2、9、30、6、3。
2、输入字符F,E,N,G,H,U,I及其相应权值30、12、2
3、22、12、7、9。
3、输入字符A,B,C,D,E,F,G,H,I,G及其相应权值19、23、25、18、12、67、23、9、32、33。
数据结构试验报告霍夫曼编码
数据结构实验报告
(三)
学院自动化学院
学号
姓名
日期2014-12-09
实验目的
1、掌握哈夫曼编码原理;
2、熟练掌握哈夫曼树的生成方法;
3、理解数据编码压缩和译码输出编码的实现;
4、掌握二叉树的基本3操作。
实验内容
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(解码)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站设计一个哈夫曼编/译码系统。
实验要求
1)初始化(Initialzation)。利用下表给出的字符集和频度的=;实际统计数据建立哈夫曼树,并将它存于文件hfmTree中;
字符空格 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
2)编码(EnCoding)。利用已建好的哈夫曼树(若不在内存中,则从文件hfmTree 中读入),对以下报文进行编码,结果存入文件Code File中;
报文内容:THIS PROGRAM IS MY FAVORITE
3)译码(Decoding)。利用已建好的哈夫曼树,对文件CodeFile中编码后的报文进行解码,结果存入文件Textfile中;
4)输出(Output)。输出字符集中每个字符的哈夫曼编码;输出原始报文,及其编码文件Code File和解码文件Textfile的内容。
数据结构哈夫曼编码实验报告
数据结构哈夫曼编码实验报告数据结构哈夫曼编码实验报告
1·实验目的
1·1 理解哈夫曼编码的基本原理
1·2 掌握哈夫曼编码的算法实现方式
1·3 熟悉哈夫曼编码在数据压缩中的应用2·实验背景
2·1 哈夫曼编码的概念和作用
2·2 哈夫曼编码的原理和算法
2·3 哈夫曼编码在数据压缩中的应用
3·实验环境
3·1 硬件环境:计算机、CPU、内存等
3·2 软件环境:编程语言、编译器等
4·实验过程
4·1 构建哈夫曼树
4·1·1 哈夫曼树的构建原理
4·1·2 哈夫曼树的构建算法
4·2 哈夫曼编码
4·2·1 哈夫曼编码的原理
4·2·2 哈夫曼编码的算法
4·3 实现数据压缩
4·3·1 数据压缩的概念和作用
4·3·2 哈夫曼编码在数据压缩中的应用方法5·实验结果
5·1 构建的哈夫曼树示例图
5·2 哈夫曼编码表
5·3 数据压缩前后的文件大小对比
5·4 数据解压缩的正确性验证
6·实验分析
6·1 哈夫曼编码的优点和应用场景分析
6·2 数据压缩效果的评估和对比分析
6·3 实验中遇到的问题和解决方法
7·实验总结
7·1 实验所获得的成果和收获
7·2 实验中存在的不足和改进方向
7·3 实验对于数据结构学习的启示和意义
附件列表:
1·实验所用的源代码文件
2·实验中用到的测试数据文件
注释:
1·哈夫曼编码:一种用于数据压缩的编码方法,根据字符出现频率构建树形结构,实现高频字符用较短编码表示,低频字符用较长编码表示。
2·哈夫曼树:由哈夫曼编码算法构建的一种特殊的二叉树,用于表示字符编码的结构。
3·数据压缩:将数据文件的大小通过编码方式压缩,减小存储空间和传输成本。
数据结构 哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
1. 实验目的
本实验旨在通过实践理解哈夫曼编码的原理和实现方法,加深
对数据结构中树的理解,并掌握使用Python编写哈夫曼编码的能力。
2. 实验原理
哈夫曼编码是一种用于无损数据压缩的算法,通过根据字符出
现的频率构建一棵哈夫曼树,并根据哈夫曼树对应的编码。根据哈
夫曼树的特性,频率较低的字符具有较长的编码,而频率较高的字
符具有较短的编码,从而实现了对数据的有效压缩。
实现哈夫曼编码的主要步骤如下:
1. 统计输入文本中每个字符的频率。
2. 根据字符频率构建哈夫曼树,其中树的叶子节点代表字符,
内部节点代表字符频率的累加。
3. 遍历哈夫曼树,根据左右子树的关系对应的哈夫曼编码。
4. 使用的哈夫曼编码对输入文本进行编码。
5. 将编码后的二进制数据保存到文件,同时保存用于解码的哈
夫曼树结构。
6. 对编码后的文件进行解码,还原原始文本。
3. 实验过程
3.1 统计字符频率
首先,我们需要统计输入文本中每个字符出现的频率。可以使用Python中的字典数据结构来记录字符频率。遍历输入文本的每个字符,将字符添加到字典中,并递增相应字符频率的计数。
```python
def count_frequency(text):
frequency = {}
for char in text:
if char in frequency:
frequency[char] += 1
else:
frequency[char] = 1
return frequency
```
3.2 构建哈夫曼树
数据结构哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
一、实验背景
1:引言
在日常生活中,信息传输已经成为了一个非常重要的环节。通过对信息进行编码,可以有效地减少信息传输的开销和存储空间。哈夫曼编码是一种常见的无损数据压缩方法,广泛应用于图像、音频和视频等领域。本实验旨在通过实现哈夫曼编码算法,深入理解其工作原理,并对其性能进行评估。
2:实验目的
本实验旨在:
a:了解哈夫曼编码算法的基本原理;
b:实现哈夫曼编码算法,并将其应用于对文本进行压缩;
c:评估哈夫曼编码算法在不同文本数据上的性能。
二、实验内容
1:哈夫曼编码原理介绍
2:哈夫曼编码的实现思路
a:构建哈夫曼树
b:哈夫曼编码表
c:对文本进行编码和解码
3:实验环境介绍
a:硬件环境
b:软件环境
4:实验步骤详解
a:构建哈夫曼树的实现方法
b:哈夫曼编码表的实现方法
c:文本编码和解码的实现方法5:实验数据与结果分析
a:不同文本数据的压缩结果对比 b:压缩性能的评估指标
6:实验心得与建议
a:实验过程中遇到的问题
b:改进与优化方向
三、实验结果与分析
1:实验数据
a:不同文本数据的大小与内容
b:压缩率等性能指标数据
2:实验结果分析
a:不同文本数据对压缩效果的影响
b:压缩率与文本数据的关系
c:哈夫曼编码的运行时间分析
四、结论
根据实验结果和分析,可以得出以下结论:
1:哈夫曼编码算法能够有效地减少文本数据的存储空间。
2:不同文本数据的压缩率存在差异,与文本的特性有关。
3:哈夫曼编码算法的运行时间与文本数据的长度成正比关系。附件:
1:实验源代码
2:实验数据和结果
哈弗曼编码数据结构实验报告
数据结构实验报告----约瑟夫环
一、需求分析:
约瑟夫环是程序的一道经典例题,可以使用数据结构的单链表进行编写。
二、概要设计:
大体上可以使用单链表通过节点的创建和删除来达到人数出列的效果,可以大大缩短程序量。
三、详细设计:
1、首先定义一个单链表,然后分别做创建链表、以及对应的输入数据,删除节点对应的删除数据,以及输出功能。最后用主函数实现上述功能。
下为程序源代码:
#include<stdio.h>
#include<malloc.h>
typedef struct Lnode //创建一个单链表
{
int num;
int key;
struct Lnode *next;
}Joseph;
struct Lnode *head,*p,*p1;
int creatlinklist(int n) //为节点分配内存,创建节点
{
int i=0;
head = (struct Lnode*)malloc(sizeof(struct Lnode));
if(!head)
{
return 0;
}
p=head;
for(i = 0;i<n-1;i++)
{
p1=(struct Lnode*)malloc(sizeof(struct Lnode));
if(!p1)
{
return 0;
}
p->next=p1;
p=p1;
}
p->next=head;
p1=head;
return 0;
}
int input(int n) //在分配的节点上输入数据
{
int i=0;
int j=0;
printf("please input the keys:\n");
数据结构哈夫曼树实验报告
数据结构哈夫曼树实验报告
一、实验内容
本次实验的主要内容是哈夫曼树的创建和编码解码。
二、实验目的
1. 理解并掌握哈夫曼树的创建过程;
2. 理解并掌握哈夫曼编码的原理及其实现方法;
3. 掌握哈夫曼树的基本操作,如求哈夫曼编码和哈夫曼解码等;
4. 学习如何组织程序结构,运用C++语言实现哈夫曼编码和解码。
三、实验原理
哈夫曼树的创建:
哈夫曼树的创建过程就是一个不断合并权值最小的两个叶节点的过程。具体步骤如下:
1. 将所有节点加入一个无序的优先队列里;
2. 不断地选出两个权值最小的节点,并将它们合并成为一个节点,其权值为这两个节点的权值之和;
3. 将新的节点插入到队列中,并继续执行步骤2,直到队列中只剩下一棵树,这就是哈夫曼树。
哈夫曼编码:
哈夫曼编码是一种无损压缩编码方式,它根据字符出现的频率来构建编码表,并通过编码表将字符转换成二进制位的字符串。具体实现方法如下:
1. 统计每个字符在文本中出现的频率,用一个数组记录下来;
2. 根据字符出现的频率创建哈夫曼树;
3. 从根节点开始遍历哈夫曼树,给左分支打上0的标记,给右分支打上1的标记。遍历每个叶节点,将对应的字符及其对应的编码存储在一个映射表中;
4. 遍历文本中的每个字符,查找其对应的编码表,并将编码字符串拼接起来,形成一个完整的编码字符串。
哈夫曼解码就是将编码字符串还原为原始文本的过程。具体实现方法如下:
1. 从根节点开始遍历哈夫曼树,按照编码字符串的位数依次访问左右分支。如果遇到叶节点,就将对应的字符记录下来,并重新回到根节点继续遍历;
2. 重复步骤1,直到编码字符串中的所有位数都被遍历完毕。
《数据结构课程设计》赫夫曼编码实验报告
目录
一、概述 (1)
二、系统分析 (1)
三、概要设计 (2)
四、详细设计 (4)
4.1 赫夫曼树的建立 (4)
4.1.1 选择选择parent 为0 且权值最小的两个根结点的算
法 (5)
4.1.2 统计字符串中字符的种类以及各类字符的个数 (7)
4.1.3构造赫夫曼树 (8)
4.2赫夫曼编码 (10)
4.2.1赫夫曼编码算法 (10)
4.2.2建立正文的编码文件 (11)
4.3代码文件的译码 (12)
五、运行与测试 (14)
六、总结与心得 (14)
参考文献 (15)
附录 (15)
一、概述
本设计是对输入的一串电文字符实现赫夫曼编码,再对赫夫曼编码生产的代码串进行译码,输出电文字符串。
在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间越来越引起人们的重视,赫夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
二、系统分析
赫夫曼编码的应用很广泛,利用赫夫曼树求得的用于通信的二进制编码成为赫夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和每个叶子对应的字符的编码,这就是赫夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串,但在信息传递时,总希望总长度能尽可能短,即采用最短码。
假设每种字符在电文中出现的次数为W i ,编码长度为L i ,电文中有n 种字符,则电文编码总长为∑W i L i 。若将此对应到二叉树上,W i 为叶节点的权,L i 为根节点到叶节点的路径长度。
数据结构哈夫曼编码实验报告-无删减范文
数据结构哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
实验背景
哈夫曼编码是一种常用的数据压缩方法,通过使用变长编码来表示不同符号,将出现频率较高的符号用较短的编码表示,从而达到压缩数据的目的。通过实现哈夫曼编码算法,我们能够更好地理解和掌握数据结构中的树形结构。
实验目的
1. 理解哈夫曼编码的原理及实现过程。
2. 掌握数据结构中树的基本操作。
3. 进一步熟悉编程语言的使用。
实验过程
1. 构建哈夫曼树
首先,我们需要根据给定的字符频率表构建哈夫曼树。哈夫曼树是一种特殊的二叉树,其叶子节点表示字符,而非叶子节点表示字符的编码。
构建哈夫曼树的过程如下:
1. 根据给定的字符频率表,将每个字符视为一个节点,并按照频率从小到大的顺序排列。
2. 将频率最小的两个节点合并为一个新节点,并将其频率设置为两个节点的频率之和。这个新节点成为新的子树的根节点。
3. 将新节点插入到原来的节点列表中,并继续按照频率从小到大的顺序排序。
4. 重复步骤2和步骤3,直到只剩下一个节点,这个节点即为哈夫曼树的根节点。
2. 哈夫曼编码表
在构建完哈夫曼树后,我们需要根据哈夫曼树每个字符的哈夫曼编码表。哈夫曼编码表是一个字典,用于存储每个字符对应的编码。
哈夫曼编码表的过程如下:
1. 从哈夫曼树的根节点出发,遍历整个树。
2. 在遍历的过程中,维护一个路径,用于记录到达每个字符节点的路径,0表示左子树,1表示右子树。
3. 当到达一个字符节点时,将路径上的编码存储到哈夫曼编码表中对应的字符键下。
3. 压缩数据
有了哈夫曼编码表后,我们可以使用哈夫曼编码对数据进行压缩。将原本以字符表示的数据,转换为使用哈夫曼编码表示的二进
数据结构哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
【正文】
1.实验目的
本实验旨在研究哈夫曼编码的原理和实现方法,通过实验验证哈夫曼编码在数据压缩中的有效性,并分析其应用场景和优缺点。
2.实验原理
2.1 哈夫曼编码
哈夫曼编码是一种无损数据压缩算法,通过根据字符出现的频率构建一颗哈夫曼树,将频率较高的字符用较短的编码表示,频率较低的字符用较长的编码表示。哈夫曼编码的编码表是唯一的,且能够实现前缀编码,即一个编码不是另一个编码的前缀。
2.2 构建哈夫曼树
构建哈夫曼树的过程如下:
1) 将每个字符及其频率作为一个节点,构建一个节点集合。
2) 每次从节点集合中选择出现频率最低的两个节点,构建一个新节点,并将这两个节点从集合中删除。
3) 将新节点加入节点集合。
4) 重复以上步骤,直到节点集合中只有一个节点,这个节点就是哈夫曼树的根节点。
2.3 编码过程
根据哈夫曼树,对每个字符进行编码:
1) 从根节点开始,根据左子树为0,右子树为1的规则,将编码依次加入编码表。
2) 对于每个字符,根据编码表获取其编码。
3) 将编码存储起来,得到最终的编码序列。
3.实验步骤
3.1 数据读取与统计
从输入文件中读取字符序列,并统计各个字符的频率。
3.2 构建哈夫曼树
根据字符频率构建哈夫曼树。
3.3 构建编码表
根据哈夫曼树,构建每个字符的编码表。
3.4 进行编码
根据编码表,对输入的字符序列进行编码。
3.5 进行解码
根据哈夫曼树,对编码后的序列进行解码。
4.实验结果与分析
4.1 压缩率分析
计算原始数据和压缩后数据的比值,分析压缩率。
4.2 编码效率分析
数据结构哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
第一章实验目的
本实验旨在掌握哈夫曼编码的原理和实现方法,并通过编写代码实现一个简单的哈夫曼编码程序。
第二章实验内容
1.理解哈夫曼编码的基本概念和原理。
2.设计并实现一个哈夫曼编码的数据结构。
3.实现哈夫曼编码的压缩和解压缩功能。
4.通过实验验证哈夫曼编码的效果和压缩比。
第三章实验步骤
1.确定实验所需的编程语言和开发环境。
2.定义并实现哈夫曼编码的数据结构。
3.实现哈夫曼编码的压缩和解压缩算法。
4.设计实验样例数据,进行测试和验证。
5.分析实验结果,计算压缩比。
第四章实验结果与分析
1.实验样例数据:________提供一段文本,统计字符出现的频率,并进行哈夫曼编码。
2.实验结果:________展示压缩后的编码结果,计算压缩比。
3.分析:________分析实验结果,讨论哈夫曼编码的效果和优劣。
第五章实验总结与感想
本次实验深入了解了哈夫曼编码的原理和实现方法,通过编写代码实现哈夫曼编码的压缩和解压缩功能。实验结果表明,哈夫曼编码能够有效地减小数据的存储空间,提高了数据传输的效率。
第六章本文档涉及附件
本实验报告所涉及到的附件包括:________
1.实验代码文件:________.c
2.实验样例数据文件:________.txt
第七章法律名词及注释
1.哈夫曼编码:________一种用于无损数据压缩的编码方法,通过对频率高的字符赋予较短的编码,对频率低的字符赋予较长的编码,从而实现压缩数据的目的。
数据结构 哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
数据结构实验报告
----------
1-实验目的
----------
本实验的目的是通过实现哈夫曼编码算法,加深对数据结构中树和堆的理解,以及掌握相关的编程技巧。
2-实验内容
----------
2-1 算法简介
----------
哈夫曼编码是一种无损压缩算法,通过根据字符出现的频率构建一颗二叉树,并将出现频率较高的字符编码为较短的二进制串,进而实现压缩的目的。在本实验中,我们需要实现以下功能:
●构建哈夫曼树
●字符编码表
●对给定的字符串进行编码
●对给定的二进制串进行解码
●实现压缩和解压缩功能
2-2 数据结构
----------
在实现哈夫曼编码算法时,我们需要使用以下数据结构:●链表:用于存储字符出现的频率及对应的字符
●堆:用于构建哈夫曼树
●树:用于存储哈夫曼编码树
●散列表或映射:用于存储字符的编码
2-3 算法步骤
----------
1-统计字符的出现频率,并构建频率链表
2-根据频率链表构建哈夫曼树
3-字符的编码表
4-对给定的字符串进行编码
5-对给定的二进制串进行解码
6-实现压缩和解压缩功能
3-实验实现
----------
3-1 数据结构的设计
----------
在本实验中,我们将使用以下数据结构:
●链表节点结构体:用于存储字符和频率
●链表结构体:用于存储链表节点的头指针
●堆节点结构体:用于存储字符和频率,并维护堆的结构
●堆结构体:用于存储堆的根节点
●树节点结构体:用于存储字符和编码,并维护哈夫曼树的结构
●树结构体:用于存储哈夫曼树的根节点
●散列表结构体:用于存储字符和对应的编码
数据结构 哈夫曼编码实验报告(2023版)
数据结构哈夫曼编码实验报告
实验目的:
本实验旨在了解和实现哈夫曼编码算法,通过将字符转换为对应的哈夫曼编码来实现数据的压缩和解压缩。
一、引言
1.1 背景介绍
哈夫曼编码是一种基于字符出现频率的编码方法,通过使用不等长编码来表示不同字符,从而实现数据的高效压缩。该编码方法在通信、存储等领域有着广泛的应用。
1.2 目标
本实验的目标是实现哈夫曼编码算法,通过对给定文本进行编码和解码,验证哈夫曼编码的有效性和可靠性。
二、实验过程
2.1 数据结构设计
在实现哈夫曼编码算法时,我们需要设计合适的数据结构来存储字符和对应的编码。常用的数据结构包括树和哈希表。我们将使用二叉树作为数据结构来表示字符的编码。
2.2 构建哈夫曼树
哈夫曼树是由给定字符集合构建而成的最优二叉树。构建哈夫
曼树的过程分为两步:首先根据字符出现频率构建叶子节点,然后
通过合并叶子节点和父节点构造哈夫曼树。
2.3 哈夫曼编码表
根据构建好的哈夫曼树,我们可以对应的哈夫曼编码表。哈夫
曼编码表由字符和对应的编码组成,可以用于字符的编码和解码。
2.4 文本压缩
利用的哈夫曼编码表,我们可以对给定的文本进行压缩。将文
本中的字符逐个替换为对应的哈夫曼编码,从而实现数据的压缩。
2.5 文本解压缩
对压缩后的数据进行解压缩时,我们需要利用的哈夫曼编码表,将哈夫曼编码逐个替换为对应的字符,从而还原出原始的文本数据。
三、实验结果
我们使用不同长度、不同频率的文本进行了实验。实验结果表明,哈夫曼编码在数据压缩方面有着显著的效果,可以大大减小数
据存储和传输的开销。
四、实验总结
哈弗曼编码数据结构实验报告
数据结构实验报告哈夫曼编码
一、需求分析:
哈夫曼编码可以进行求取最优二叉树,以及进行编码等实际问题,当利用哈夫曼树做前缀编码,有效的节约存储密码的时间。
二、概要设计:
首先定义一个哈弗曼树结构体,哈夫曼编码数组之后,编写输入函数(包括存到文件的部分),哈弗曼构造函数(从文件中调用构造),求哈夫曼编码函数,输出函数(打印出哈夫曼编码)等。
三、详细设计:
下为程序源代码:
#include
#include
#include
#include
#define Maxsize 100
typedef struct
{
char data;
double weight;
int parent;
int lchild;
int rchild;
}HTNode;
HTNode ht[Maxsize];
typedef struct
{
char cd[Maxsize];
int start;
}HCode;
HCode hcd[Maxsize];
void Initialization(char str[], double w[], int n);
void getn(char str[], double w[], int *n);
void writehfmTree(int n);
void Encoding(int n);
void ReadhfmTree(void);
void Decoding(int n);
void TreePrint(int i);
void Menu(char *ch);
int getnumber(char *ch, int repeat);
最新数据结构哈夫曼编码实验报告
最新数据结构哈夫曼编码实验报告
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码,此实验即设计这样的一个简单编 / 码系统。系统应该具有如下的几个功能:
1、接收原始数据。
从终端读入字符集大小 n ,以及 n 个字符和 n 个权值,建立哈夫曼树,并将它存于文件 nodedata.dat 中。
2 、编码。
利用已建好的哈夫曼树(如不在内存,则从文件 nodedata.dat 中读入),对文件中的正文进行编码,然后将结果存入文件 code.dat 中。
3 、译码。利用已建好的哈夫曼树将文件 code.dat 中的代码进行译码,结果存入文件
tetfile.dat 中。
4、打印编码规则。
即字符与编码的一一对应关系。
二、
【数据结构设计】
1、构造哈夫曼树时使用静态链表作为哈夫曼树的存储。
在构造哈夫曼树时,设计一个结构体数组 HuffNode 保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有 n 个叶子结点的哈夫曼树共有 2n-1 个结点,所以数组 HuffNode 的大小设置为 2n-1 ,描述结点的数据类型为: typedef struct
{
int weight;// 结点权值
int parent;
int lchild;
int rchild;
char inf;
}HNodeType;
2 、求哈夫曼编码时使用一维结构数组 HuffCode 作为哈夫曼编码信息的存储。
求哈夫曼编码,实质上就是在已建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域回退到根结点,没回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼码值,由于一个字符的哈夫曼编码是从根结点到相应叶子结点所经过的路径上各分支所组成的0 、
数据结构课程设计-哈夫曼编码实验报告
数据结构课程设计报告
实验二哈夫曼编码
目录
一.问题描述及分析p1
1.问题描述p1
2.需求分析p1 二.功能模块及数据结构描述p1
1.数据结构描述 p1 2.模块描述 p2
三.主要算法流程描述p2
1.编码流程图 p3 2.译码流程图 p4
四.使用说明p5 五.调试分析说明p6
一.问题描述及分析
1.问题描述
设计一个哈夫曼编码/译码系统,对一个文本文件中的字符进行哈夫曼编码,生成编码文件(后缀名.cod);反过来,可将一个编码文件还原为一个文
本文件(.txt)。
2.需求分析
(1)输入一个待压缩的文本文件名,统计文本文件中各字符的个数作为权值,生成哈夫曼树;
(2)将文本文件利用哈夫曼树进行编码,生成编码文件(后缀名cod);
(3)输入一个待解压的压缩文件名称,并利用相应的哈夫曼树将编码序列译码;
(4)显示指定的编码文件和文本文件;
3.运行要求
.Windows xp/2003
.VC++6.0(或以上)运行库
二.功能模块及数据结构描述
1.数据结构描述
typedef struct
{
long weight;
long lchild,rchild,parent;
}hfmt;
hfmt t[2*256-1];
存放哈夫曼树结构体,weight为节点权值,lchild,rchild为节点的左右孩子在向量中的下标(为叶节点时,两值为:-1),parent为节点的双亲在向量中的
下标(用来区别根与非根节点,值为-1与非-1)。
typedef struct
{
char bits[256];
long s;
}hfmcc;
hfmcc cc[256];
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
――实验五简单哈夫曼编/译码的设计与实现本实验的目的是通过对简单哈夫曼编/译码系统的设计与实现来熟练掌握树型结
构在实际问题中的应用。此实验可以作为综合实验,阶段性实验时可以选择其中的几
个功能来设计和实现。
一、【问题描述】
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码,此实验即设计这样的一个简单编/码系统。系统应该具有如下的几个功能:
1、接收原始数据。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件nodedata.dat中。
2、编码。
利用已建好的哈夫曼树(如不在存,则从文件nodedata.dat中读入),对文件中的正文进行编码,然后将结果存入文件code.dat中。
3、译码。利用已建好的哈夫曼树将文件code.dat中的代码进行译码,结果存入文件textfile.dat中。
4、打印编码规则。
即字符与编码的一一对应关系。
二、【数据结构设计】
1、构造哈夫曼树时使用静态链表作为哈夫曼树的存储。
在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1,描述结点的数据类型为:
typedef struct
{
int weight;//结点权值
int parent;
int lchild;
int rchild;
char inf;
}HNodeType;
2、求哈夫曼编码时使用一维结构数组HuffCode作为哈夫曼编码信息的存储。
求哈夫曼编码,实质上就是在已建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域回退到根结点,没回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼码值,由于一个字符的哈夫曼编码是从根结点到相应叶子结点所经过的路径上各分支所组成的0、1序列,因此先得到的分支代码为所求编码的低位码,后得到的分支代码位所求编码的高位码,所以设计如下数据类型:
#define MAXBIT 10
typedef struct
{
int bit[MAXBIT];
int start;
}HcodeType;
3、文件nodedata.dat、code.dat和textfile.dat。
三、【功能(函数)设计】
1、初始化功能模块。
此功能模块的功能为从键盘接收字符集大小n,以及n个字符和n个权值。
2、建立哈夫曼树的功能模块。
此模块功能为使用1中得到的数据按照教材中的构造哈夫曼树的算法构造哈夫曼树,即将HuffNode数组中的各个位置的各个域都添上相关的值,并将这个结构体数组存于文件hfmtree.dat中。
3、建立哈夫曼编码的功能模块。
此模块功能为从文件nodedata.dat中读入相关的字符信息进行哈夫曼编码,然后将结果存入code.dat中,同时将字符与0、1代码串的一一对应关系打印到屏幕上。
4、译码的功能模块。
此模块功能为接收需要译码的0、1代码串,按照3中建立的编码规则将其翻译成字符集中字符所组成的字符串形式,存入文件textfile.dat,同时将翻译的结果在屏幕上打印输出。
四、【编码实现】
#include
#include
#include
#include
#define MaxBit 10
#define Maxvalue 100//应该大于权重之和
#define Maxleaf 100
#define Maxnode Maxleaf*2-1
typedef struct
{
int weight;
int parent;
int lchild;
int rchild;
char inf;
}HNodeType;
struct HcodeType
{
int bit[MaxBit];
int start;
};
void Creat_Haffmantree(int &n)
{
HNodeType *HaffNode=new HNodeType[2*n-1];
int i,j;
int m1,m2,x1,x2;
for(i=0;i<2*n-1;i++)
{
HaffNode[i].weight=0;
HaffNode[i].parent=-1;
HaffNode[i].lchild=-1;
HaffNode[i].rchild=-1;
HaffNode[i].inf='0';
}
for(i=0;i { cout<<"请输入字符"< cin>>HaffNode[i].inf; cout<<"请输入该字符的权值"< cin>>HaffNode[i].weight; } for(i=0;i { m1=m2=Maxvalue; x1=x2=0; for(j=0;j { if(HaffNode[j].parent==-1&&HaffNode[j].weight { m2=m1; x2=x1; m1=HaffNode[j].weight;