哈夫曼编译码课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.打印程序运行时的初值和运行结果,画出相应的图示