哈夫曼编码译码系统实验报告,数据结构课程设计
数据结构哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
一、实验目的:
通过哈夫曼编、译码算法的实现,巩固二叉树及哈夫曼树相关知识的理解掌握,训练学生运用所学知识,解决实际问题的能力。
二、实验内容:
已知每一个字符出现的频率,构造哈夫曼树,并设计哈夫曼编码。
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。
哈夫曼编码和译码
右子 0 0 0 0 0 0 0 0 7 4 9 10 11 12 14
23 11 5
29 14 3 7 8
哈夫曼树的存储结构
9
1 2 3 4 5 6 7 8
0 1 0
1
1
0
1 1 1 0 0 1 1 0 1 1 0 0 0 0 1 1 1 0 1 0
哈夫曼编码
10
结点结构描述: 结点结构描述: typedef struct { float weight; /*数据域用于存放权值 ; 数据域用于存放权值 数据域用于存放权值*/ int lchild,parent,rchild;/*指针域 , 指针域*/ , ; 指针域 }htnode,*hufmtree; , ; typedef char * huffmancode; ; 其中,每个结点包含 个域 个域, 其中,每个结点包含4个域,weight域用于存放结点 域用于存放结点 的权值, 分别为结点的左, 的权值,lchild,rchild分别为结点的左,右孩子在一维 , 分别为结点的左 数组(或静态链表)中的下标, 数组(或静态链表)中的下标,parent是结点的双亲在 是结点的双亲在 一维数组中的下标加1. 一维数组中的下标加 .
难点
确定贪心选择标准,实现哈夫曼编译码器. 确定贪心选择标准,实现哈夫曼编译码器.
哈夫曼编码 假设每种字符在电文中出现的次数为wi, 假设每种字符在电文中出现的次数为 ,其编码 长度为li,电文中有n种字符 种字符, 长度为 ,电文中有 种字符,则电文总长度应为 n w1l1+w2l2+…+ wnln= ∑ w i l i .对应到二叉树上,n 对应到二叉树上, i =1 可以看作是二叉树中叶子结点的个数, 可以看作是二叉树中叶子结点的个数,wi可以看作是 叶子结点的权值, 恰为从根结点到叶子结点K 叶子结点的权值,li恰为从根结点到叶子结点 i的路 径长度,显然, 径长度,显然,设计电文总长度最短的二进制前缀 编码即是构造以字符出现频率作为权值的具有n个叶 编码即是构造以字符出现频率作为权值的具有 个叶 子结点的哈夫曼树, 子结点的哈夫曼树,由此所得到的二进制前缀编码 称为哈夫曼编码( 称为哈夫曼编码(Huffman Code). ).
哈夫曼编码译码系统实验报告,数据结构课程设计报告
v .. . ..
安徽大学
数据结构课程设计报告项目名称:哈弗曼编/译码系统的设计
与实现
姓名:鉏飞祥
学号:E21414018
专业:软件工程
完成日期
2016/7/4
计算机科学与技术学院
1 .需求分析
1.1问题描述
•问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(解码)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站设计一个哈夫曼编译码系统。
1.2基本要求
(1)输入的形式和输入值的范围;
(2)输出的形式;
(3)程序所能达到的功能。
1.基本要求
(1)初始化(Initialzation)。从数据文件DataFile.data中读入字符及每个字符的权值,建立哈夫曼树HuffTree;
(2)编码(EnCoding)。用已建好的哈夫曼树,对文件ToBeTran.data中的文本进行编码形成报文,将报文写在文件Code.txt中;
(3)译码(Decoding)。利用已建好的哈夫曼树,对文件CodeFile.data中的代码进行解码形成原文,结果存入文件Textfile.txt中;
(4)输出(Output)。输出DataFile.data中出现的字符以及各字符出现的频度(或概率);输出ToBeTran.data及其报文Code.txt;输出CodeFile.data
及其原文Textfile.txt;
2. 概要设计
说明本程序中用到的所有抽象数据类型的定义。主程序的流程以及各程序模块之间的层次(调用)关系。
哈夫曼编码译码数据结构课程设计
数据结构课程设计
题目:哈夫曼编码译码
姓名:
专业:通信工程
学号:
指导教师:吴泽晖
目录
目录 (1)
一、需求分析 (2)
二、设计要求 (2)
三、概要设计 (2)
1、流程图 (2)
2、设计包含的几个部分 (4)
四、详细设计 (2)
五、显示结果………………………………………………9.
六、心得体会 (10)
七、参考文献 (11)
哈夫曼编码译码
一、需求分析
在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视,赫夫曼编码正是一种应用广泛且非常有效的数据压缩技术。哈夫曼编码是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。哈弗曼编码使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。赫夫曼编码的应用很广泛,利用赫夫曼树求得的用于通信的二进制编码称为赫夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是赫夫曼编码。哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。
二、设计要求
对输入的一串电文字符实现赫夫曼编码,再对赫夫曼编码生成的代码串进行译码,输出电文字符串。通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度能尽可能短,即采用最短码。假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为∑WiLi。若将此对应到二叉树上,Wi为叶结点的权,Li为根结点到叶结点的路径长度。那么,∑WiLi 恰好为二叉树上带权路径长度。因此,设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作权,构造一棵赫夫曼树,此构造过程称为赫夫曼编码。设计实现的功能: (1) 赫夫曼树的建立; (2) 赫夫曼编码的生成; (3) 编码文件的译码。
数据结构 课程设计之哈夫曼编码
(一) 哈夫曼树的设计思想
对于一组具有确定权值的叶子结点可以构造出多个具有不同带权路径长度的二叉树,其中具有最小带权路径长度的二叉树称作哈夫曼树或者最优二叉树。
首先给定n 个权值创造n 个只含根结点的二叉树,得到一个二叉树林;再在这二叉树林里面找根结点的权值最小和次小的两棵树作成新的二叉树,其中新的二叉树的根结点的权值为摆布子根结点权值之和;最后在二叉树林中把组合过的二叉树删除,再重复第二步,直到最后就剩一颗二叉树的时候得到的这棵二叉树就是哈夫曼树。
(二)哈夫曼编码与解码的设计思想
在数据通讯中,时常要将传送的文字转换为二进制字符0 和1 组成的二进制串,称这个过程为编码。与子相对的是解码或者是译码,就是用与编码相同的方式将二进制串转换称编码前的文字的过程称作解码。在这里是通过哈夫曼树实现编码与解码的,所以称作是哈夫曼编码与解码。
首先输入一个字符串,还有相应的在哈夫曼树里的权值,这样用哈夫曼树把字符串用二进制串代替它,这个过程要注意树和编码问题,其中树的问题在上面已经解决,主要看编码的问题,就是根据我们输入的字符串和权值建立相应的树模型,这一步完成那编码就已经完成为了,最后打印就行了;然后就是解码,完成编码相应的解码就相对简单了,就是先找到在编码的时候建的那个模型树,将编码中的二进制串再根据权值转换为相应的字符串,这样一步步解码就行了。
以上就是通过用哈夫曼树进行哈夫曼编码与解码如何实现的主要设计思想。
(一)哈夫曼树的流程图
不 是
图 1 哈夫曼树的流程图
(二)编码与解码的流程图
图 2 编码与解码的流程图
数据结构 哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
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.引言
1.1 编写目的
本文档旨在详细介绍数据结构课程设计中的哈夫曼编码器的设
计过程和实现方法。
1.2 背景
哈夫曼编码是一种常用的数据压缩技术,通过构建变长编码表,将频率较高的字符用较短的编码表示,从而减小数据的存储和传输
开销。
1.3 参考资料
[1] 斯科特·梅耶, 数据结构与算法分析[C], 机械工业出版社, 2014.
[2] Thomas H.Cormen, Charles E.Leiserson, Ronald
L.Rivest, Clifford Stein, Introduction to Algorithms, The MIT Press, 2009.
2.需求分析
2.1 功能需求
2.1.1 输入文件
用户可以输入需要进行哈夫曼编码的文件路径。
2.1.2 编码操作
系统根据输入的文件,相应的哈夫曼编码,并显示编码结果。
2.1.3 解码操作
用户可以输入已经编码过的文件,系统将根据编码表进行解码,并显示解码结果。
2.2 非功能需求
2.2.1 性能要求
系统在处理大规模文件时需要具备较高的性能,保证编码和解
码的效率。
2.2.2 用户友好性
系统需要提供简洁明了的界面,方便用户操作。
2.2.3 可扩展性
系统需要具备良好的扩展性,满足未来需求变化的需要。
3.概要设计
3.1 总体设计
系统采用面向对象的设计方法,主要包含以下几个类:
3.1.1 HuffmanEncoder
该类负责对输入文件进行哈夫曼编码的操作。
3.1.2 HuffmanDecoder
数据结构课程设计总结报告 哈夫曼编码译码
《数据结构》课程设计
实验报告
题目哈夫曼编码/译码器
学院数理与信息学院
专业计算机科学与技术
班级计科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 4
2.问题分析
(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]的哈夫曼编码。
数据结构课程设计哈夫曼编码实验
数据结构设计性实验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 字符
1
16
1
18
8
23
80
频度
p 21 f q
15 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}。
数据结构 哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
正文:
1:引言
本实验旨在学习和实现哈夫曼编码算法,通过对文本文件进行
压缩和解压缩操作,以提高数据传输和存储效率。本报告详细记录
了实验的设计、实现过程、实验结果以及相应的分析和讨论。
2:算法原理
2.1 哈夫曼编码原理
哈夫曼编码是一种变长编码的方式,根据字符出现的频率来构
建不同长度的编码,以实现高效地压缩数据。其主要步骤包括构建
哈夫曼树、哈夫曼编码表和对文本进行编码。
2.2 构建哈夫曼树
构建哈夫曼树的过程首先需要统计文本中每个字符出现的频率,然后根据频率构建最小堆,将频率较小的字符作为叶子节点,频率
较大的字符作为父节点,并不断合并节点,直到构建完整的哈夫曼树。
2.3 哈夫曼编码表
根据构建好的哈夫曼树,可以通过遍历树的路径来每个字符对应的哈夫曼编码,其中左分支表示0,右分支表示1,通过遍历整个树的路径可以得到每个字符的哈夫曼编码。
2.4 对文本进行编码和解码
根据的哈夫曼编码表,可以将文本中的每个字符进行编码,将编码后的二进制数据写入到文件中。对于解码操作,则是根据哈夫曼编码表和编码后的二进制数据,通过遍历哈夫曼树来还原出原始的文本。
3:实验设计
3.1 实验环境
本实验在操作系统为Windows的计算机上使用C++语言进行编程实现。
3.2 实验步骤
(1) 读取待压缩的文本文件。
(2) 统计文本中每个字符的频率。
(3) 构建哈夫曼树。
(4) 哈夫曼编码表。
(5) 将原始文本编码为二进制文件。
(6) 解码二进制文件,还原出原始文本。
4:实验实现
4.1 数据结构
(1) 节点结构体:包括字符和频率两个成员。
数据结构 哈夫曼树编码译码 课程设计 实验报告
数据结构课程设计设计题目:哈夫曼树编码译码
目录
第一章需求分析 (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”的序列作为和各个叶子对应的字符的编码,这就是哈夫曼编码。哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。
数据结构哈夫曼编码实验报告-无删减范文
数据结构哈夫曼编码实验报告
数据结构哈夫曼编码实验报告
实验背景
哈夫曼编码是一种常用的数据压缩方法,通过使用变长编码来表示不同符号,将出现频率较高的符号用较短的编码表示,从而达到压缩数据的目的。通过实现哈夫曼编码算法,我们能够更好地理解和掌握数据结构中的树形结构。
实验目的
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 编码效率分析
哈夫曼编译码器课程设计报告完整版
哈夫曼编译码器课程设
计报告完整版
IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】
XXX学院本科
数据结构课程设计总结报告设计题目:实验一、哈夫曼编/译码器
学生姓名:XXX
系别:XXX
专业:XXX
班级:XXX
学号:XXX
指导教师:XXX XXX
2012年 6 月 21日
xxx学院
课程设计任务书
题目一、赫夫曼编译码器
专业、班级xxx
学号xxx 姓名xxx
主要内容、基本要求、主要参考资料等:
1. 主要内容
利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道(既可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼的编/译码系统。
2. 基本要求
系统应具有以下功能:
(1)C:编码(Coding)。对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中
(2)D:解码(Decoding)。利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。
(3)P:打印代码文件(Print)。将文件codefile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件codeprint中。
(4)T:打印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。
哈夫曼编译码器课程设计报告
《数据结构》
课程设计报告
题目: 哈夫曼编/译码器 专业: 计算机科学与技术(对口)
班级: 13(3) 姓名: 陈霞 指导教师: 彭飞 成
绩:
计算机学院 2015年11月12日
2015-2016学年 第1学期
目录
1 设计内容及要求 (3)
1。1 内容 (3)
1。2 要求 (3)
2 概要设计 (3)
2。1 抽象数据类型定义 (3)
2.2 模块划分 (4)
3 设计过程及代码 (5)
3。1 设计过程 (5)
3.2 代码 (7)
4 设计结果与分析 (10)
5 参考文献 (12)
1设计内容及要求
1.1 内容
利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本.但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统.试为这样的信息收发站写一个哈夫曼编/译码系统.
1.2 要求
一个完整的系统应具有以下功能:
(1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n 个权值,建立哈夫曼树,并将它存于文件hfmTree中。
(2)E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件htmTree 中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
(4)P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码写入文件CodePrint中。
哈夫曼编码译码器实验报告
哈夫曼编码译码器实验报告
实验名称:哈夫曼编码译码器实验
一、实验目的:
1.了解哈夫曼编码的原理和应用。
2.实现一个哈夫曼编码的编码和译码器。
3.掌握哈夫曼编码的编码和译码过程。
二、实验原理:
哈夫曼编码是一种常用的可变长度编码,用于将字符映射到二进制编码。根据字符出现的频率,建立一个哈夫曼树,出现频率高的字符编码短,出现频率低的字符编码长。编码过程中,根据已建立的哈夫曼树,将字符
替换为对应的二进制编码。译码过程中,根据已建立的哈夫曼树,将二进
制编码替换为对应的字符。
三、实验步骤:
1.构建一个哈夫曼树,根据字符出现的频率排序。频率高的字符在左
子树,频率低的字符在右子树。
2.根据建立的哈夫曼树,生成字符对应的编码表,包括字符和对应的
二进制编码。
3.输入一个字符串,根据编码表将字符串编码为二进制序列。
4.输入一个二进制序列,根据编码表将二进制序列译码为字符串。
5.比较编码前后字符串的内容,确保译码正确性。
四、实验结果:
1.构建哈夫曼树:
-字符出现频率:A(2),B(5),C(1),D(3),E(1) -构建的哈夫曼树如下:
12
/\
/\
69
/\/\
3345
/\/\/\/\
ABCDE
2.生成编码表:
-A:00
-B:01
-C:100
-D:101
-E:110
3.编码过程:
4.译码过程:
5.比较编码前后字符串的内容,结果正确。
五、实验总结:
通过本次实验,我了解了哈夫曼编码的原理和应用,并且实现了一个简单的哈夫曼编码的编码和译码器。在实验过程中,我充分运用了数据结构中的树的知识,构建了一个哈夫曼树,并生成了编码表。通过编码和译码过程,我进一步巩固了对树的遍历和节点查找的理解。实验结果表明,本次哈夫曼编码的编码和译码过程正确无误。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
安徽大学
数据结构课程设计报告项目名称:哈弗曼编/译码系统的设计
与实现
姓名:鉏飞祥
学号:E********
专业:软件工程
完成日期
2016/7/4
计算机科学与技术学院
1 .需求分析
1.1问题描述
•问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(解码)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站设计一个哈夫曼编译码系统。
1.2基本要求
(1) 输入的形式和输入值的范围;
(2) 输出的形式;
(3) 程序所能达到的功能。
1.基本要求
(1)初始化(Initialzation)。从数据文件DataFile.data中读入字符及每个字符的权值,建立哈夫曼树HuffTree;
(2)编码(EnCoding)。用已建好的哈夫曼树,对文件ToBeTran.data中的文本进行编码形成报文,将报文写在文件Code.txt中;
(3)译码(Decoding)。利用已建好的哈夫曼树,对文件CodeFile.data 中的代码进行解码形成原文,结果存入文件Textfile.txt中;
(4)输出(Output)。输出DataFile.data中出现的字符以及各字符出现的频度(或概率);输出ToBeTran.data及其报文Code.txt;输出CodeFile.data 及其原文Textfile.txt;
2. 概要设计
说明本程序中用到的所有抽象数据类型的定义。主程序的流程以及各程序模块之间的层次(调用)关系。
(1)数据结构
哈夫曼树的节点
struct huff
{
int weight;
int parent;
int l;
int r;
};
哈夫曼编码的存储
struct huff *hufftree;
(2)程序模块
选择1到i-1中parent为0且权值最小的两个下标
void Select(struct huff *HT, int n, int &s1, int &s2)
构建哈夫曼树:
void huffmancoding(struct huff *ht,int *w,int n)
对原文进行编码:
void code(char *c)
根据报文找到原文:
void decoding(char *zifu)
3. 详细设计
核心技术分析:
1:构建哈夫曼树及生成哈夫曼编码:
根据每个字符权值不同,根据最优二叉树的构建方法,递归生成哈夫曼树,并且用数组存放哈夫曼树。
再从每一叶子节点向树根遍历,求得编码
例如:
如图所示的四个节点v1,v2,v3,v4,他们的权值分别为7,11,4,5
7 11 4 5
第一步:选择两个权值最小的节点作为左右子孩子,建立一个二叉树,双亲权值为两个自孩子之和,如图
7 11 9
重复第一步:
11 16
27
则此时建立的是优有二叉树,约定定左子树边编码为1,右子树编码为0,则可以对次二叉树进行编码,如图:
则各顶点的编码为:
V1 01
V2 1
V3 001
V4 000
2:将原文编码:
逐个从文件读入字符,根据已经建立好的哈夫曼树,找到每一字符对应的编码
3:将报文译码:
步骤一:
先读入一个字符,存入匹配字符串
步骤二:
根据匹配串找所有的哈夫曼编码,如果找到对应的编码,则输入该编码所对
应的字符,如果找不到,则读入两个字符存入匹配串,重复步骤二,找到为止。
步骤三:
把剩下的字符重复步骤一二
4. 测试与分析
调试过程,不可能错的分配空间的语句却莫名的让整个程序崩溃,关于编译原理和内存分配的各种问题太欠缺。学了计算机组成原理与体系结构也不知道
比如在自定义函数中:
Char **c;
C=(char **)malloc(4*sizoef(char *));
C[2]=(char *)malloc(4*sizeof(char));
这样竟然会让程序这执行到这一句时崩溃,本来不可能有错误的。
而这句如果写在主函数中,就不会有问题。
分配的空间不大,不可能是内存不够用。
解决的方法是分开,把
C=(char **)malloc(4*sizoef(char *));
放在主函数中,另外一句不变依然在自定义函数中。
malloc和free尽量配对使用,注意:malloc后通常要对返回值进行判断,避免发生不必要的错误。
注意,最好再p 被free掉后,加上p=NULL这句
“野指针”不是NULL指针,是指向“垃圾”内存(不可用内存)的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if无法判断一个指针是正常指针还是“野指针”。有个良好的编程习惯是避免“野指针”的唯一方法。
指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字(尤其是delete),它们只是把指针所指