哈夫曼编码课程设计报告之欧阳家百创编
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖南科技学院
欧阳家百(2021.03.07)
数据结构课程设计报告课题: 霍夫曼编码
专业班级:信计1202
学号:201205001239
姓名:黄思琪
指导教师: 牛志毅
1 课程设计的目的和意义
在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度尽可能最短,即采用最短码。
2.需求分析
课题:哈夫曼编码译码器系统
问题描述:打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,
编码完成后再对其编码进行译码。
问题补充:1. 从硬盘的一个文件里读出一段英语文章;
2. 统计这篇文章中的每个字符出现的次数;
3. 以字符出现字数作为权值,构建哈夫曼树
4. 对每个字符进行编码并将所编码写入文件然后对所编
码进行破译。
具体介绍:在本课题中,我们在硬盘D盘中预先建立一个
xuzhimo.txt文档,在里面编辑一篇文章(大写)。然后运
行程序,调用fileopen()函数读出该文章,显示在界
面;再调用tongji()函数对该文章的字符种类进行统
计,并对每个字符的出现次数进行统计,并且在界面
上显示;然后以每个字符出现次数作为权值,调用
Create_huffmanTree()函数构建哈夫曼树。然后调用
Huffman_bianma()函数对哈夫曼树进行编码,调用
coding()函数将编码写入文件。
3 系统(项目)设计
(1)设计思路及方案
本课题是用最优二叉树即哈夫曼树来实现哈夫曼编码译码器的功能。假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为(W1*L1)+(W2*L2)+…+(Wi*Li)。若将此对应到二叉树上,Wi为叶结点,Li为根结点到叶结点的路径长度。那么,(W1*L1)+(W2*L2)+…+(Wi*Li)恰好为二叉树上带权路径长度。
因此,设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作权,构造一棵哈夫曼树,此构造过程称为哈夫曼编码。
该系统将实现以下几大功能:从硬盘读取字符串,建立哈夫曼树,输出哈夫曼树的存储结构的初态和终态,输出各种字符出现的次数以及哈夫曼编码的译码等。
(2)模块的设计及介绍
1从硬盘读取字符串
fileopen(参数)
{
实现命令;
打印输出;
}
2建立HuffmanTree
通过三个函数来实现:
void select_min(参数)
{
初始化;
for
{
接受命令;
处理命令;
}
}
说明:在ht[1....k]中选择parent为0且权值最小的两个根结点的算法
int tongji(参数)
{
初始化;
for
{
接受命令;
处理命令;
}
}
说明:统计字符串中各种字母的个数以及字符的种类
void Create_huffmanTree()
{
初始化;
for
{
接受命令;
处理命令;
}
输出字符统计情况;
}
说明:构造哈夫曼树
3哈夫曼编码
void Huffman_bianma(参数)
{
定义变量;
{
处理命令;
}
}
说明:哈夫曼编码
(3)主要模块程序流程图
下面介绍三个主要的程序模块流程图:①主函数流程图:
图3.1
流程图注释:
该图比较简单,主要是调用各个函数模块,首先代开已经存在的文件,然后统计总的字符数以及出现的各个字符和频率。然后才开始建立哈夫曼树,接着在哈夫曼树的基础上对其进行编码。最后输出结束。
②构造哈夫曼树:
图3.2
流程图注释:
该图是表示构造哈夫曼树的过程。首先输入num个叶结点的权值,当i=num是循环结束。然后进行哈夫曼树的构建,当i=2*num-1是循环结束。最后输出所得到的字符统计情况。
③哈夫曼编码:
图3.3
流程图解释:
该流程图表四哈夫曼编码情况。首先初始化,Cd[--start]=0,start=num。然后进行
编码,当cd[--start]=T[p].lchild==c时,cd[--start]=0;当cd[--start]=T[p].left!==c时,cd[--start]=1。这个编码循环一直到i=num 时结束。
4 系统实现
各模块关键代码及算法的解释:
①主调函数
代码解释:这是main函数里的各个函数调用情况。
fileopen(string); //从硬盘中读取文件
num=tongji(string,cishu,str); //统计字符种类及各类字符出现的频率
Create_huffmanTree(HT,HC,cishu,str);//建立哈夫曼树
Huffman_bianma(HT,HC); //生成哈夫曼编码
②建立HuffmanTree
代码解释:该函数为在ht[1....k]中选择parent为0且权值最小的两个根结点的算法,其序号为s1和s2。
void select_min(HuffmanTree T,int k,int &x1,int &x2)
{
int i,j;
int min1=1000;
for(i=1;i<=k;i++)
if(T[i].weight { j=i; min1=T[i].weight; } x1=j;min1=1000;