哈夫曼编译码课程设计报告

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

一、需求分析

1.运行环境:Microsoft Visual C++

2.程序所实现的功能:

初始化:输入一串字符(正文),计算不同字符(包括空格)的数目以及每种字符出现的频率(以该种字符出现的次数作为其出现频率),根据权值建

立哈夫曼树,输出每一种字符的哈夫曼编码。

编码:利用求出的哈夫曼编码,对该正文(字符串)进行编码,并输出。

译码:对于得到的一串编码,利用已求得的哈夫曼编码进行译码,将译出的正文输出。

输出哈夫曼树形态:以树的形式输出哈夫曼树。

3.程序的输入,包含输入的数据格式和说明:

there are three students(char型)

4.程序的输出,程序输出的形式:

②统计字符出现次数并输出

③根据字符出现次数求出哈夫曼编码并输出(根据算法差异得到的编码可能不

同,但应具有两个特征,一是编码长度应与表中相同,二是编码应该是前缀编码)

④以树的形式输出哈夫曼树

二、设计说明

1. 算法设计的思想

1) 确定哈夫曼树和哈夫曼编码的储存表示

2)在HT[1..n]中选择parent为0的且weight最小的两个节点s1和

s2

3)w存放n个字符的权值(均>0),构造哈夫曼树HT,输出静态链表(数组)储存哈夫曼树储存结构模拟,然后求出n个字符的哈夫曼编码HC

4)利用哈夫曼编码对密文进行译码,输出译后的字符串

5) 在main()中实现:输入一串字符(正文),计算不同字符(包括空格)的数目以及每种字符出现的频率(以该种字符出现的次数作为其出现频率,然后调用各子函数实现该程序功能

2.主要的数据结构设计说明

Select(HuffmanTree &HT, int n, int &s1, int &s2)

{//在HT[1..n]中选择parent为0且weight最小的两个结点,

// 其序号分别为s1和s2。

HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n)

{ // w存放n个字符的权值(均>0),构造哈夫曼树HT,

// 并求出n个字符的哈夫曼编码HC

for (i=n+1; i<=m; i++) { // 建哈夫曼树

// 在HT[1..i-1]中选择parent为0且weight最小的两个结点,

// 其序号分别为s1和s2。

Select(HT, i-1, s1, s2);

HT[s1].parent = i; HT[s2].parent = i;

HT[i].lchild = s1; HT[i].rchild = s2;

HT[i].weight = HT[s1].weight + HT[s2].weight;

HuffmanTran(HuffmanTree &HT,char* &str1,char* &str2,int n)

{//利用哈夫曼编码对密文进行译码,输出译后的字符串

3.程序的主要流程图

4.程序的主要模块,要求对主要流程图中出现的模块进行说明

1)初始化:

①输入正文:输入一串字符(正文)

②统计字符出现次数并输出:计算不同字符(包括空格)的数目以及每种字符出现的频率(以该种字符出现的次数作为其出现频率)

③求出哈夫曼编码并输出

④以树的形式输出哈夫曼树

2)编码:

发送方利用得到的哈夫曼编码对正文进行编码,输出密文

3)译码:

接收方利用哈夫曼编码对密文进行译码,输出译后的字符串

5.程序的主要函数及其伪代码说明

Select(HuffmanTree &HT, int n, int &s1, int &s2)

//在HT[1..n]中选择parent为0且weight最小的两个结点,

// 其序号分别为s1和s2。

HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n) {

// w存放n个字符的权值(均>0),构造哈夫曼树HT,

// 并求出n个字符的哈夫曼编码HC

for (i=n+1; i<=m; i++) { // 建哈夫曼树

// 在HT[1..i-1]中选择parent为0且weight最小的两个结点,

// 其序号分别为s1和s2。

Select(HT, i-1, s1, s2);

HT[s1].parent = i; HT[s2].parent = i;

HT[i].lchild = s1; HT[i].rchild = s2;

HT[i].weight = HT[s1].weight + HT[s2].weight;

HuffmanTran(HuffmanTree &HT,char* &str1,char* &str2,int n)

{//利用哈夫曼编码对密文进行译码,输出译后的字符串

三、上机结果及体会

1.实际完成的情况说明:

初始化:输入一串字符(正文),计算不同字符(包括空格)的数目以及每种字符出现的频率(以该种字符出现的次数作为其出现频率),根据权值建立哈夫曼树,输出每一种字符的哈夫曼编码。

编码:利用求出的哈夫曼编码,对该正文(字符串)进行编码,并输出。

译码:对于得到的一串编码,利用已求得的哈夫曼编码进行译码,将译出的正文输出。

输出哈夫曼树形态:以树的形式输出哈夫曼树。

2. 程序的性能分析,包括时空分析

程序相对比较复杂,以四维数组为哈弗曼树的存储结构

3.打印程序运行时的初值和运行结果,画出相应的图示

相关文档
最新文档