哈夫曼编码译码器课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计说明书

课程名称:数据结构与算法

设计题目:哈夫曼编\译码器

院系:计算机科学与信息工程学院

学生姓名:刘文杰

学号:16031210229

专业班级:软件工程16-2

指导教师:孙高飞

2017年12 月11日

课程设计任务书

哈夫曼编\译码器

摘要:采用哈夫曼编码思想实现对字符串的编码,以及对编码的解码。字符串的长度不小于5000字节。读取要编码的文本文件,将文件的内容进行编码,生成新的文件。对编码文件进行解码,获得文本文件。将译码的文本文件和原文件进行比较,恢复文件和原文件必须完全一致。

关键词:构建哈夫曼树哈弗曼编码哈夫曼译码字符串编码打印编码函数

目录

1.设计背景 (1)

1.1哈夫曼树的介绍 (1)

1.2设计的作用、目的 (1)

1.3设计任务及要求 (2)

2.设计方案 (2)

2.1实验内容 (2)

2.2操作思路 (2)

2.3基本操作 (3)

3. 方案实施 (4)

3.1 C语言编程 (4)

3.2程序介绍 (12)

3.3程序流程图以及说明 (13)

图3 主程序流程图 (13)

4. 结果与结论 (14)

4.1程序运行结果 (14)

4.2总结 (16)

5. 收获与致谢 (17)

6. 参考文献 (17)

1.设计背景

1.1哈夫曼树的介绍

Huffman Tree,中文名是哈夫曼树或霍夫曼树或者赫夫曼树,它是最优二叉树。定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。

(01) 路径和路径长度

定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。

(02)结点的权及带权路径长度

定义:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。

(03) 树的带权路径长度

定义:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。

1.2设计的作用、目的

通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法。主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。

通过课程设计各环节的实践,应达到如下要求:

1.理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法;

2.根据哈夫曼编码算法,考虑一个有多种可能符号(各种符号发生的概率不同)的信源,得到哈夫曼编码和码树;

3.掌握哈夫曼编码的优缺点;

4.通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法。

1.3设计任务及要求

1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法;

2. 掌握哈夫曼编码/费诺编码方法的基本步骤及优缺点;

3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程;

2.设计方案

2.1实验内容

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,哈夫曼树的构造规则为:

1.将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

2.在森林中选出根结点的权值最小的两棵树进行合并,作为一棵新树的左、右子树,

且新树的根结点权值为其左、右子树根结点权值之和;

3.从森林中删除选取的两棵树,并将新树加入森林;

4.重复(02)、(03)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

2.2操作思路

以{5,6,7,8,15}为例,来构造一棵哈夫曼树。

第1步:创建森林,森林包括5棵树,这5棵树的权值分别是5,6,7,8,15。

第2步:在森林中,选择根节点权值最小的两棵树(5和6)来进行合并,将它们作为一颗新树的左右孩子(谁左谁右无关紧要,这里,我们选择较小的作为左孩子),并且新树

的权值是左右孩子的权值之和。即,新树的权值是11。然后,将"树5"和"树6"从森林中删除,并将新的树(树11)添加到森林中。

第3步:在森林中,选择根节点权值最小的两棵树(7和8)来进行合并。得到的新树的权值是15。然后,将"树7"和"树8"从森林中删除,并将新的树(树15)添加到森林中。第4步:在森林中,选择根节点权值最小的两棵树(11和15)来进行合并。得到的新树的权值是26。然后,将"树11"和"树15"从森林中删除,并将新的树(树26)添加到森林中。

第5步:在森林中,选择根节点权值最小的两棵树(15和26)来进行合并。得到的新树的权值是41。然后,将"树15"和"树26"从森林中删除,并将新的树(树41)添加到森林中。

此时,森林中只有一棵树(树41)。这棵树就是我们需要的哈夫曼树!

3. 方案实施

3.1 C语言编程

#include

#include

#include

#define MAX 99999

#define N 27 //定义最多节点个数

#define M 2*N - 1 //中间节点个数

typedef struct

{

int weight;

int parent;

int LChild;

int RChild;

}HTNode,HuffmanTree[M+1];//因为零号单元不使用

typedef char* HuffmanCode[N+1];

HuffmanCode co;//创建全局变量用于储存HuffmanCode

char CH[N];

int weight[N] ={64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1};

相关文档
最新文档