哈夫曼树编码译码实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
数 据 结 构 课 程 设 计
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
题目, 哈夫曼树编码译码
课题名称 哈夫曼树编码译码
院 系 年级专业 学 号 姓 名 成 绩
1、课题设计目的:
在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文
件的存储空间和计算机网络的传送时间已越来越引起人们的重视,
哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。哈夫曼
编码是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度
最小的二叉树,经常应用于数据压缩。哈弗曼编码使用一张特殊的
编码表将源字符(例如某文件中的一个符号)进行编码。这张编码
表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立
起来的。
2、课题设计意义: 课题设计
哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进
制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路目的与
径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的
设计意义 分支表示“1”码,取每条路径上的“0”或“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”的序列作为和各个叶子对应的字符的编码,这就是哈夫曼编码。哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。
第二章 设计要求
对输入的一串电文字符实现哈夫曼编码,再对哈夫曼编码生成的代码串进行译码,输出电文字符串。通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度能尽可能短,即采用最短码。假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为?WiLi。若将此对应到二叉树上,Wi为叶结点的权,Li为根结点到叶结点的路径长度。那么,?WiLi恰好为二叉树上带权路径长度。因此 ,设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作权,构造一棵哈夫曼树,此构造过程称为哈夫曼编码。设计实现的功能: (1) 哈夫曼树的建立; (2) 哈夫曼编码的生成; (3) 编码文件的译码。
1
第三章 概要设计
哈夫曼编\译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树生成哈夫曼编码后进行译码 。
在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,称之为哈夫曼编码。
最简单的二进制编码方式是等长编码。若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送电文的总长度。哈夫曼树课用于构造使电文的编码总长最短的编码
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
。
2
(1)其主要流程图如图1-1所示。
开始
将data和权值赋给ht
否 结点数是否大于1
是
输出根结点和权值
否
I<2*N?
是
I++
调用SELECT函数 计算根结点函数
双亲结点为两子结点之和
输出两子结点和已构造的结点
否
是否为根结点,
是 是
左子是否为空,
否 是
右子是否为空 此时编码为0
否
编码为1
结束
3
(2)设计包含的几个方面:? 哈夫曼树的建立
哈夫曼树的建立由哈夫曼算法的定义可知,初始森林中共有n棵只含有根结点的二叉树。算法的第二步是:将当前森林中的两棵根结点权值最小的二叉树,合并成一棵新的二叉树;每合并一次,森林中就减少一棵树,产生一个新结点。显然要进行n,1次合并,所以共产生n,1个新结点,它们都是具有两个孩子的分支结点。由此可知,最终求得的哈夫曼树中一共有2n,1个结点,其中n个结点是初始森林的n个孤立结点。并且哈夫曼树中没有度数为1的分支结点。我们可以利用一个大小为2n--1的一维数组来存储哈夫曼树中的结点。
? 哈夫曼编码
要求电文的哈夫曼编码,必须先定义哈夫曼编码类型,根据设计要求和实际需要定义的类型如下:
typedet struct {
char ch; // 存放编码的字符
char bits[N,1]; // 存放编码位串
int len; // 编码的长度
}CodeNode; // 编码结构体类型
? 代码文件的译码
译码的基本思想是:读文件中编码,并与原先生成的哈夫曼编码表比较,遇到相等时,即取出其对应的字符存入一个新串中。
第四章 详细设计
(1)?哈夫曼树的存储结构描述为:
#define N 50 // 叶子结点数
#define M 2*N-1 // 哈夫曼树中结点总数
typedef struct {
int weight; // 叶子结点的权值
int lchild, rchild, parent; // 左右孩子及双亲指针
}HTNode; // 树中结点类型
typedef HTNode HuffmanTree[M+1]; ?哈弗曼树的算法
void CreateHT(HTNode ht[],int n) //调用输入的数组ht[],和节点数n {
int i,k,lnode,rnode;
int min1,min2;
4
for (i=0;i<2*n-1;i++)
ht[i].parent=ht[i].lchild=ht[i].rchild=-1; //所有结点的相关域置初值-1
for (i=n;i<2*n-1;i++) //构造哈夫曼树
{
min1=min2=32767; //int的范围是-32768—32767
lnode=rnode=-1; //lnode和rnode记录最小权值的两个结点位置
for (k=0;k<=i-1;k++)
{
if (ht[k].parent==-1) //只在尚未构造二叉树的结点中查找
{
if (ht[k].weight
#include //要用system函数要调用的头文件
#include //用getch()要调用的头文件
#include
#define N 50 //义用N表示50叶节点数
#define M 2*N-1 //用M表示节点总数 当叶节点数位n时总节点数为2n-1 #define MAXSIZE 100
typedef struct
{
char data; //结点值
int weight; //权值
int parent; //双亲结点
int lchild; //左孩子结点
int rchild; //右孩子结点
}HTNode;
typedef struct
12
{
char cd[N]; //存放哈夫曼码
int start; //从start开始读cd中的哈夫曼码
}HCode;
void CreateHT(HTNode ht[],int n) //调用输入的数组ht[],和节点数n {
int i,k,lnode,rnode;
int min1,min2;
for (i=0;i<2*n-1;i++)
ht[i].parent=ht[i].lchild=ht[i].rchild=-1; //所有结点的相关域置初值-1
for (i=n;i<2*n-1;i++) //构造哈夫曼树
{
min1=min2=32767; //int的范围是-32768—32767
lnode=rnode=-1; //lnode和rnode记录最小权值的两个结点位置
for (k=0;k<=i-1;k++)
{
if (ht[k].parent==-1) //只在尚未构造二叉树的结点中查找
{
if (ht[k].weight
本文档为【哈夫曼树编码译码实验报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。