哈夫曼编码和译码系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:哈夫曼编码和译码系统院系:
专业:
姓名:
学号:
指导教师:
日期:
实训报告
目录
一、前言 (1)
二、需求分析 (1)
1.问题描述 (1)
2.基本要求 (1)
3.根据需求,该系统应具备以下功能......................2.
三、概要设计 (2)
1.哈夫曼编码和译码的方法概述 (2)
2.流程图 (3)
四、详细设计 (4)
1.用类来定义变量和函数 (4)
2.构造哈夫曼树 (5)
3.根据哈夫曼树进行哈夫曼编码 (6)
4.输出对应的哈夫曼编码表 (7)
5.对输入的字符进行编码 (8)
6.对输入的编码进行译码 (9)
7.主函数 (10)
五、调试分析 (13)
六、实验总结 (16)
一、前言
在这个信息高速发展的时代,每时每刻都进行着大量的信息传递,到处都离不开信息,它贯穿在人们日常的生活之中,对人们产生的影响日趋扩大,而利用哈夫曼码进行通信则可以大大提高信道利用率,缩短通信传输时间,降低传输成本。在生产中则可以更大可能的降低成本从而获得更大里润,这也是信息时代发展的趋势所在。本次实训设计的是哈夫曼编码和译码系统,建立一个简易的系统,对于给定的一篇英文文章,统计字符出现的概率,并根据概率建立Huffman树,利用Huffman 编码对文章进行编码和译码。掌握Huffman树的建立及应用,并进一步熟练掌握程序的设计流程。这是个拥有完整功能的系统程序,对将所学到的知识运用到实践中,在设计的同时,培养了学生各方面的能力。
二、需求分析
1.问题描述
在传送电文时,人们总是希望传送时间尽可能短,这就是要求使电文代码长度尽可能短。利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统能够对待传输数据预先编码,在接收端将传来的数据进行译码,所以为这样的信息收发站写一个哈夫曼的编译码系统。
2.基本要求
输入一段英文原文,构造哈夫曼树,生成对应的编码表,输出原文对应的编码,或者是根据已生成的编码表,输入一段二进制数编码,得
到对应的字符原文。
3.根据需求,该系统应具备以下功能
对给出的字符以及字符的权值构造哈夫曼树,生成对应的编码表
输入一段原文,对原文进行编码
输入二进制编码,输出对应的原文
三、概要设计
1.哈夫曼编码和译码的方法概述
初始化,每个字符就是一个结点,对应节点的权值大小,选取权值最小的两个结点,以它们为儿子,构造出一个新的结点;新结点的权值就是它两个儿子的权值之和;构造之后,从原来的结点序列里删除刚才选出的那两个结点,但同时将新生成的结点加进去;如果结点序列里只剩下一个结点,表示构造完毕,退出。否则回到第一步。
对某个结点而言,其左孩子在当前阶段的编码为0,右孩子的编码为1,这样就可以通过遍历树来生成字符一一对应的编码表
来到这里,基本上艰苦的已经完成了,对某个具体的字符串编码和解码就只是简单的“查表——替换”的工作了。
译码:
译码也是个简单的查表--替换过程。如果利用该种编码发送字符串,则它的“字符——编码”对应表也必须发送过去,然后对给出的一串编码,从左向右,将编码组合起来并查表,一旦找到有匹配的字符,则将当前的编码替换为对应的字符。
因为该编码是不会出现”某一个字符的编码是另一个字符编码的
缀”这种情况的,也就是不会出现类似于“A 为00而B 为0010”这样的情况,所以译码出来的字符串是唯一的,而且就是原来进行编码的那一个。
2.流程图
四、详细设计
1.用类来定义变量和函数
class Node //节点类
{
public:
friend Hafuman;
char data; //结点值
int weight; //权值
int parent; //双亲结点
int lchild; //左孩子结点
int rchild; //右孩子结点
void CreateHT(Node ht[], int n);
void CreateHCode(Node ht[], Hafuman hcd[], int n);
};
class Hafuman
{
public:
friend Node;
char cd[N]; //存放哈夫曼码
int start; //从start开始读cd中的哈夫曼码
void DispHCode(Node ht[], Hafuman hcd[], int n);
void editHCode(Node ht[], Hafuman hcd[], int n);
void deHCode(Node ht[], Hafuman hcd[], int n);
};
2.构造哈夫曼树
void Node::CreateHT( Node ht[], int 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;//记录最小权值的两个结点位置
for (k = 0; k <= i - 1; k++)
{
if (ht[k].parent == -1) //只在尚未构造二叉树的结点中查找
{
if (ht[k].weight { min2 = min1; rnode = lnode;