哈弗曼编码综合设计报告Word格式.docx
《哈弗曼编码综合设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《哈弗曼编码综合设计报告Word格式.docx(33页珍藏版)》请在冰豆网上搜索。
xxxxxx班级:
xxxxxxxxxx
类别
合计
分值
各项分值
评分标准
实际得分
合计得分
备注
平时表现
10
按时参加综合设计,无旷课、迟到、早退、违反实验室纪律等情况。
完成情况
30
20
按设计任务书的要求完成了全部任务,能完整演示其设计内容,符合要求。
能对其设计内容进行详细、完整的介绍,并能就指导教师提出的问题进行正确的回答。
报告质量
35
报告文字通顺,内容翔实,论述充分、完整,立论正确,结构严谨合理;
报告字数符合相关要求,工整规范,整齐划一。
5
课题背景介绍清楚,综述分析充分。
设计方案合理、可行,论证严谨,逻辑性强,具有说服力。
符号统一;
图表完备、符合规范要求。
能对整个设计过程进行全面的总结,得出有价值的结论或结果。
参考文献数量在3篇以上,格式符合要求,在正文中正确引用。
答辩情况
25
在规定时间内能就所设计的内容进行阐述,言简意明,重点突出,论点正确,条理清晰。
15
在规定时间内能准确、完整、流利地回答教师所提出的问题。
总评成绩:
分
补充说明:
指导教师:
xxxxxx(签字)
日期:
xxxx年x月xxx日
答辩记录表
xxxxxx学号:
xxxxxxx班级:
xxxxxx
答辩地点:
答辩内容记录:
答辩成绩
答辩小组成员(签字):
xxxx年x月xx日
指导教师评语
指导教师:
xxxxxxx(签字)
xxxx年x月xxx日
一、综合设计目的、条件、任务和内容要求:
《数据结构》在计算机科学中是一门核心专业基础课,在整个计算机课程体系中处于承上启下的核心地位,它一方面扩展和深化在离散数学、程序设计语言等课程学到的基本技术和方法,一方面为进一步学习其它专业课奠定坚实的理论与实践基础。
课程的主要任务是学习数据的逻辑结构,存储结构以及相关的算法设计。
《应用软件综合设计》是计算机科学与技术专业学生的一门实践课程,是学习完数据结构课程后的课程设计,本课程的目的是使学生学会分析待加工处理数据的特性,以便选择适当的逻辑结构、存储结构以及进行相应的算法设计。
在教给学生数据结构选择和算法设计的同时,培养学生的抽象思维能力、逻辑推理能力和形式化思维方法,增强分析问题和解决问题的能力。
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
综合设计的任务是:
设计一个哈夫曼编码/译码系统,使学生掌握哈夫曼编码的特点、存储方法和基本原理,培养学生利用C++语言编写程序以及调试程序的能力,运用数据结构知识解决实际问题的能力,为后续计算机专业课程的学习打下坚实的基础。
内容:
分两个层次
层次一:
用下表中给出的字符和频度数据编程建立哈夫曼树,并实现对以下报文进行编码/译码。
THISPROGRAMISMYFAVORITE
字符
空格
A
B
C
D
E
F
G
H
I
J
K
L
M
频度
186
64
13
22
32
103
21
47
57
1
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
63
48
51
80
23
8
18
16
层次二:
编程从键盘任意输入一段报文,首先统计字符的频度,然后建立哈夫曼树,并给出报文的编码/译码。
指导教师签字:
xxxxxxxx
xxxxxxxx年x月x日
二、进度安排:
第3周(9.13-9.14):
学生熟悉课题的任务和要求,查阅相关文献和资料,并做好编码准备
第3周(9.14-9.17):
程序编码、调试
第4周(9.20-9.23):
程序编码、调试和测试,书写报告
第4周(9.24):
答辩、检查、验收、递交设计报告
三、应收集资料及主要参考文献:
应收集的资料:
面向对象程序设计思想和方法
C/C++语言参考手册
数据结构、软件工程方面参考书籍
主要参考文献:
[1]李晓林,张俊.程序设计基础[M].北京:
中国铁道出版社,2008
[2]张俊,张彦铎.C++面向对象程序设计[M].北京:
[3]陈慧南.数据结构—使用C++语言描述[M].北京:
人民邮电出版社,2008
四、综合设计(课程设计)摘要(中文):
利用所学的《数据结构》和其他C++语言,设计一个哈夫曼编码/译码系统,实现两个层次的编码/译码功能,第一个层次是利用给定的字符和对应的频度数据构建哈夫曼数实现对报文的编码/译码,另一个层次则是输入任意一段报文,统计其频度,然后构建哈夫曼数,实现报文的编码/译码。
两者不同之处在于频度是否给定和未知,通过C++语言编写实现这两个方面的要求。
在编写实现过程中要注意最后是需要利用文件流进行输入报文和编/译码的,因此在编写程序代码中注意适当的调整代码的结构语言,使能够与文件流方面的要求匹配,节省编写代码的时间。
本次课程设计中,充分的运用了全局变量编写代码,实现了报文的存取和运算,实现课程设计的要求,并且能够可视化的输入输出报文,存在文档里。
五、综合设计(课程设计)Abstract(英文):
Usethedatastructureandtheotherthec++language,designahoffmannencoding/decodingsystem,realizetheencoding/decodingtwolevels,thefirstlevelisthefunctionofthecharactersandusingacorrespondingfrequencydatatoconstructhoffmannnumberofmessageencoding/decoding,anotherlevelisamessage,anyinputfrequency,andthenconstructthenumberofhoffmann,realizethemessageencoding/decoding.Bothdiffersisgivenandtheunknownfrequency,writtenbyc++languagetoachievebothrequirements.
Intheprocessofwritingdocumentflowtousethemessageandinput/decoding,soinwritingcodeofstructureadjustmentoftheappropriatelanguage,makethecodeanddocumentationrequirementsofflow,savethetimeofwritingcode.
Thiscoursedesign,makefulluseoftheglobalvariables,codeaccesstothemessageandthecoursedesign,realization,andvisualizationofinputandoutput,thedocumentmessage.
摘要………………………………………………………………………………………II
Abstract…………………………………………………………………………………...II
第一章哈夫曼编码与译码………………………………………………………………..1
1.1编码与译码概述…………………………..…………………………………………...1
1.2设计编码与译码问题…………………………………..…………………………...…1
第二章哈夫曼编码与译码设计………………....……………….…………………………2
2.1编码译码设计简介……………………………………..……………………………...2
2.2编码译码设计方案……………………..………………..………………………….…2
第三章编码与译码详细设计……………………………………………..………………..3
3.1哈夫曼编码………………..……………………………..………………………….…3
3.2哈夫曼译码……………………………..………………..………………………….…6
第四章设计结果及分析…………………………………………………..………………..7
4.1编码结果及分析……………………………….………………………………..……7
4.2译码结果及分析….……………………………………..………………………….…8
总结…….……………………………………………………..………………………….…9
致谢…….………………………………………………..…..………………………….…10
参考文献…….………………..…………………………...…..………………………….…11
附录主要程序代码………...……………………………….………………………….…12
摘要
关键词:
哈夫曼树;
编码;
译码;
文件流;
全局变量
Abstract
Keywords:
Hoffmanntree;
Code;
Decoding;
Documentflow;
Globalvariables
第一章哈夫曼编码与译码
1.1编码与译码概述
1.1.1哈夫曼编码译码背景
Huffman编码是一种可变长编码方式,是由美国数学家DavidHuffman创立的,是二叉树的一种特殊转化形式。
编码的原理是:
将使用次数多的代码转换成长度较短的代码,而使用次数少的可以使用较长的编码,并且保持编码的唯一可解性。
Huffman算法的最根本的原则是:
累计的(字符的统计数字*字符的编码长度)为最小,也就是权值(字符的统计数字*字符的编码长度)的和最小。
1.1.2哈夫曼编码译码目的
哈夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件。
哈夫曼压缩属于可变代码长度算法一族。
意思是个体符号(例如,文本文件中的字符)用一个特定长度的位序列替代。
因此,在文件中出现频率高的符号,使用短的位序列,而那些很少出现的符号,则用较长的位序列。
1.2编码与译码问题
分为两个层次的编写,第一层是用给定表中给出的字符和频度数据编程建立哈夫曼树,并实现对报文进行编码/译码,另一层则是编程从键盘任意输入一段报文,首先统计字符的频度,然后建立哈夫曼树,并给出报文的编码/译码。
第二章哈夫曼编码与译码设计
2.1编码译码设计简介
2.1.1哈夫曼编码译码设计思想
本次课程设计总体思想是从文件输入报文/码文,然后运行编写的程序自动在另个文件中得到码文/报文,从文件输入的报文提取到内存中,然后构建哈夫曼树,对每个报文中的字符和对应的频度进行分析,然后构建符合要求的哈夫曼树,然后扫描所要编码的报文,找到相对应的字符后,往上找双亲,并且判断左右子树进行编码,最终的到报文的整体码文。
译码文则是利用哈夫曼树的原理,扫描码文。
‘0’‘1’代表左右子树,进行遍历。
最终找到叶子,对应的字符输出即可。
2.1.2设计简介
设计一个哈夫曼树,其叶子用来存储字符和字符相应的频度,在需要进行编码译码的时候,都要遍历该哈夫曼树,编码的遍历是先找到对应叶子字符,然后增加一个指向双亲的指针,回溯编码,译码则是一个一个扫描码文中的码,然后按照‘0’则左子树,‘1’则是右子树的遍历方式,一旦找到叶子则重新从树的根节点重新遍历,直到最后将码文编写完。
2.2编码译码设计方案
在课程设计中,构建一个哈夫曼树时,需要在叶子中存储两个信息,一个是字符,另一个则是字符对应的频度,由于哈夫曼编码的原理是利用频度进行编码,但是编码译码的时候,我们需要得到字符,因此在哈夫曼类中,增加一个对应的存取字符的变量,这个变量要与频度相关联,并且在基础结构中增加一个指向双亲的指针用于回溯编码,一个另类的哈夫曼树就可以编写了。
编码和译码都是在代码中进行,结果则是在文档中显示,因此设计生成两个文档,一个用于存取字符报文,一个用于存取码文,然后根据用户需要,编码或者是译码。
通过可视化的文档能够完成本次的课程设计的要求。
第三章编码与译码详细设计
3.1哈夫曼编码
3.1.1给定字符频度哈夫曼编码
对于给定字符频度的报文进行编码,根据所学的哈夫曼编码的知识,在哈夫曼树生成的过程是通过比较权值构建哈夫曼树,这里权值是字符的频度,但是频度对应的字符却不能够存储在哈夫曼树中,因此在结构BTNode中,增加了一个字符型的变量charsysbol,用来存储字符,并且增加了一个int类型的数组Bits[]存储该结点的码。
在BTNode结构中,另外还增加了一个指向双亲结点的指针parent,方便以后查找双亲编码。
如下的BTNode的函数代码。
template<
classT>
structBTNode
{BTNode(){lChild=rChild=parent=NULL;
}
BTNode(constT&
x)
{element=x;
lChild=rChild=parent=NULL;
}
x,BTNode<
T>
*l,BTNode<
*r)
lChild=l;
rChild=r;
parent=NULL;
Telement;
charsysbol;
intBits[128];
BTNode<
*lChild,*rChild,*parent;
};
在类BinaryTree中,由于哈夫曼树的构建基本上是通过BinaryTree类中的函数实现,因此将编码和译码函数写入BianryTree类中给类HfmTree调用,这样,在HfmTree类中不需要特别多的函数,只是存在调用类的私有成员函数即可,其他函数都可以放入BianryTree类中。
如下代码则是BianryTree类的成员函数和私有成员。
template<
classBinaryTree
{public:
BinaryTree(){root=NULL;
boolRoot(T&
x)const;
voidMakeTree(constT&
e,BinaryTree<
&
left,BinaryTree<
right);
voidPreOrder(void(*Visit)(T&
x));
BTNode<
*RetRoot(){returnroot;
voidFLeaves(chark){FLeaves(root,k);
voidFLeaves(BTNode<
*t,charl);
voidStCode(BTNode<
*p);
voidSetCode(BTNode<
*t);
voidTransCode(){TransCode(root);
voidTransCode(BTNode<
protected:
*root;
private:
voidClear(BTNode<
x),BTNode<
*t);
为了将给定字符频度的字符存入到哈夫曼树中,并且能够保证字符和字符频度同时存入,这里定义了一个node结构,它里面包含两个结构变量,int类型变量wet用来存储字符频度,char类型变量sys用来存储相应字符。
创建一个该结构的数组,用来存储所有的字符和频度。
并且定义一个int型的全局变量count来计算字符的长度。
另外当读出码文的时候,最开始那个码文是倒置,用一个全局数组int型的bits[length]来存入这些倒置码文,并且记录这么码文的长度。
在扫描字符的过程中,将扫描出来的字符在哈夫曼树中进行遍历,遍历到叶子后,利用函数回溯,找出倒置的码文,存在bits[]数组中,然后倒序赋值给另一个全局数组codestyle[],准备存入文件中。
一下是这几个全局数组及其对应的全局变量的声明和定义,相同的,定义一个char型的数组wd[]用存放译码后得到的字符,准备存入文件中。
intcodestyle[128];
intlnth=0;
intbits[128];
intlength=0;
charwd[128];
intlenth=0;
structnode
{intwet;
charsys;
structnodeTree[m];
intcount=1;
对于给定的哈夫曼编码,如何实现对一段报文的编码已经变得非常清晰,首先从文件中一个一个提取字符,然后使用函数FLeaves(BTNode<
*t,charl)在已知的哈夫曼树上进行遍历,查找字符,当查到匹配的字符后,调用函数SetCode(BTNode<
*j)回溯遍历双亲,判断是否为双亲的左右子树,然后编码得到倒置的码文,将倒置码文逐个输入到数组bits[]中,最后将bits[]中的码文倒置输入到数组codestyle[]中,实现这个过程需要调用函数StCode(BTNode<
*p),最后将codestyle中的码文逐个输入到另一个文件中,实现了从文件中输入字符,在给定字符频度的情况下在另一个文件中生成码文。
这几个函数的嵌套使用最后实现了编码了功能。
下面是这几个程序的函数定义。
template<
voidBinaryTree<
:
FLeave