赫夫曼编码.docx
- 文档编号:30524260
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:24
- 大小:157.37KB
赫夫曼编码.docx
《赫夫曼编码.docx》由会员分享,可在线阅读,更多相关《赫夫曼编码.docx(24页珍藏版)》请在冰豆网上搜索。
赫夫曼编码
《数据结构与算法》课程设计
(2013/2014学年第一学期17周)
指导教师:
杨东鹤王敏丽
班级:
12计科
(2)班
学号:
2012329620050
姓名:
XXX
《数据结构与算法》课程设计
目录
一、题目--赫夫曼编码/译码器
二、实验目的
三、需求分析
四、概要设计
五、详细设计
六、调试分析
七、总结
一、题目--赫夫曼编码/译码器
二、实验目的
数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。
因此,主要有三个方面的内容:
数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。
通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
在当今信息时代,信息技术己成为当代知识经济的核心技术。
我们时刻都在和数据打交道。
比如人们在外出工作时找最短路径,在银行查询存款、通过互联网查新闻、以及远程教育报名等,所有这些都在与数据发生关系。
实际上,现实世界中的实体经过抽象以后,就可以成为计算机上所处理的数据。
数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:
♦了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
♦初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
♦提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
三、需求分析
1.问题描述
利用赫夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站编写一个赫夫曼码的编/译码系统。
2.基本要求
一个完整的系统应具有以下功能:
(1)I:
初始化(Initialization)。
从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中。
(2)E:
编码(Encoding)。
利用已建好的赫夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3)D:
译码(Decoding)。
利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。
以下为选做:
(4)P:
印代码文件(Print)。
将文件CodeFile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrin中。
(5)T:
印赫夫曼树(Treeprinting)。
将已在内存中的赫夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的赫夫曼树写入文件TreePrint中。
3.测试要求
(1)已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计赫夫曼编码。
(2)用下表给出的字符集和频度的实际统计数据建立赫夫曼树,并实现以下报文的编码和译码:
“THISPROGRAMEISMYFAVORITE”。
字符
A
B
C
D
E
F
G
H
I
J
K
L
M
频度
186
64
13
22
32
103
21
15
47
57
1
5
32
20
字符
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
频度
57
63
15
1
48
51
80
23
8
18
1
16
1
4.实现提示
(1)编码结果以文本方式存储在文件Codefile中。
(2)用户界面可以设计为“菜单”方式:
显示上述功能符号,再加上“Q”,表示退出运行Quit。
请用户键入一个选择功能符。
此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。
(3)在程序的一次执行过程中,第一次执行I,D或C命令之后,赫夫曼树已经在内存了,不必再读入。
每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。
具体要求:
课程设计成果的内容必须由以下四个部分组成,缺一不可。
(1)上交源程序:
学生按照实验题目的具体要求所开发的所有源程序(应该放到一个文件夹中);
(2)上交程序的说明文件:
(保存在.txt中)在说明文档中应该写明上交程序所在的目录,上交程序的主程序文件名,如果需要安装,要有程序的安装使用说明;
(3)设计报告:
(保存在word文档中,文件名要求:
按照“姓名_学号_设计题目”起名,如文件名为“张三_XXX_赫夫曼编码”.doc。
打印稿用A4纸)。
其中包括:
♦题目;
♦实验目的;
♦需求分析:
在该部分中叙述实现的功能要求;
♦概要设计:
在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义);
♦详细设计
各个算法实现的源程序,对每个题目要有相应的源程序(可以是一组源程序,每个功能模块采用不同的函数实现)。
源程序要按照写程序的规则来编写。
要结构清晰,重点函数的重点变量、重点功能部分要加上清晰的程序注释;
♦调试分析
测试数据,测试输出的结果,时间复杂度分析,和每个模块设计和调试时存在问题的思考(问题是哪些?
问题如何解决?
),算法的改进设想;
♦总结:
总结可以包括:
设计过程的收获、遇到问题及解决问题过程的思考、程序调试能力的思考、对数据结构这门课程的思考、在设计过程中对《数据结构》课程的认识等内容。
5.考核成绩评定标准:
本课程设计的评价由三部分组成,包括程序演示(50%),课程设计报告(30%),回答教师提问(20%)。
1.程序演示:
Ø优功能完善,全部测试正确,并且能够对局部进行完善。
Ø良功能完善,但测试欠缺。
Ø中功能基本完善,但程序尚有部分错误。
Ø及格完成内存中赫夫曼编码/译码,但不涉及文件操作。
Ø不及格功能不完善,且程序错误较多,无法运行。
2.课程设计报告:
Ø优包括设计内容,设计思想,已经完成的任务及达到的目标,设计思路清晰、书写条理清楚,源程序结构合理、清晰,注释说明完整,有对本次课程设计的心得体会。
Ø良包括设计内容,设计思想,已经完成的任务及达到的目标,设计思路基本清晰、书写条理基本清楚,源程序结构合理、清晰,注释说明基本完整,有对本次课程设计的心得体会。
Ø中课程设计报告内容基本完整,思路较清晰,书写基本清楚,源程序结构尚可,有注释说明但不完整。
Ø及格课程设计报告内容基本完整,思路较差,书写尚清楚。
Ø不及格课程设计报告内容不完整,书写没有条理。
3.回答教师提问:
Ø优能回答教师提出的所有问题,并完全正确,思路清晰
Ø良基本能回答教师提出的所有问题,有些小错误
Ø中基本能回答教师提出的问题,少数问题回答错误或不清楚
Ø及格能回答教师提出的问题,但较多问题回答错误或不能回答
Ø不及格基本不能回答教师提出的问题
四、概要设计
1)问题分析哈夫曼树的定义
1.哈夫曼树节点的数据类型定义为:
typedefstruct{//赫夫曼树的结构体
charch;
doubleweight;//权值
intparent;
intlchild;
intrchild;
}hnode,*hfmtree;
typedefhnodehuffman[maxleaf*2-1];
huffmanh;//定义一个结构数组
2)所实现的功能函数如下
1.voidInitialization()
初始化哈夫曼树,利用顺序存储结构,按照哈夫曼规则建立2叉树。
因为声明定义了全局结构数组存储哈夫曼树,故函数不需传参。
从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中。
2.voidEncoding()
利用已建好的赫夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
利用for循环实现顺序查找和相应的结点匹配将编码存入文件中。
3.voiddecoding()利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。
同样利用顺序查找的方法实现字符和编码的一一匹配。
4.voidPrint()
印代码文件(Print)。
将文件CodeFile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件CodePrin中。
将已经译码好的文件按照一定规则输出。
5.voidTreePrint(intm,intn)
采用递归算法,实现赫夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的赫夫曼树写入文件TreePrint中。
6.intmain()
主函数主要设计的是一个分支语句,让用户挑选所实现的功能。
以及一些界面设计的功能。
3)系统结构图(功能模块图)
五、详细设计
※哈夫曼编码/译码器的源代码
#include
#include
#include
#include
#include
#include
usingnamespacestd;
#definemaxleaf30//定义最多的叶子结点
#definelen20
typedefstruct{//赫夫曼树的结构体
charch;
doubleweight;//权值
intparent;
intlchild;
intrchild;
}hnode,*hfmtree;
typedefhnodehuffman[maxleaf*2-1];
huffmanh;//定义一个结构数组
intleaves;
typedefstruct{//用于存储哈夫曼编码
intstart;
intbit[len];
}hcode;
typedefhcodehuffcode[maxleaf];
huffcodecode;
//初始化哈夫曼树,参考书本上两个算法,并合并
voidInitialization(){
//书本算法1
cout<<"输入节点的个数:
";//输入叶子结点的个数
cin>>leaves;
inti,j;
for(i=0;i h[i].ch=0; h[i].lchild=-1; h[i].parent=-1; h[i].rchild=-1; h[i].weight=0; } for(i=0;i cout<<"请输入第"< a4): "; getchar(); h[i].ch=getchar(); cin>>h[i].weight; } for(i=0;i doublem1,m2; intm1_pos,m2_pos;//m1存放最小的权值,m2存放次小的权值 m1=m2=65536; m1_pos=m2_pos=0;//m1存放最小的权值的对应下标,m2存放次小的权值下标 for(j=0;j if(h[j].weight m2=m1; m1=h[j].weight; m2_pos=m1_pos; m1_pos=j; } elseif(h[j].weight m2=h[j].weight; m2_pos=j; } } h[leaves+i].parent=-1;//生成新根,无双亲 h[leaves+i].lchild=m1_pos;//新根左孩子在数组的下标 h[leaves+i].rchild=m2_pos;//新根右孩子在数组的下标 h[m1_pos].parent=leaves+i;//原根的父亲位置 h[m2_pos].parent=leaves+i;//原根的父亲位置 h[leaves+i].weight=m2+m1; if(m2==65536)break; } //书本算法二 intp,c; hcodehf;//赫夫曼编码,将每个叶子结点编码 fstreamfile("hfmTree.txt",ios: : out); for(i=0;i c=i; p=h[i].parent; hf.start=len-1; while(p! =-1){ if(h[p].lchild==c){ hf.bit[hf.start]=0; } else{ hf.bit[hf.start]=1; } --hf.start; c=p; p=h[c].parent; } file< cout< for(j=hf.start+1;j code[i].bit[j]=hf.bit[j]; file< cout< }file< code[i].start=hf.start+1; } file.close(); cout< ! ! "< system("pause"); } //输入字符,用于实现哈夫曼编码 voidEncoding(){ cout<<"请输入需要编码的字符串: "; charm; fstreamfile("CodeFile.txt",ios: : out); getchar(); while((m=getchar())! ='\n'){ for(inti=0;i if(m==h[i].ch){ for(intj=code[i].start;j file< break; } } } file.close(); cout<<"."< cout< ! ! "< system("pause"); } //将输入的字符实现译码 voiddecoding(){ fstreamfin("Codefile.txt",ios: : in);//读入要译码的文件 fstreamfout("Textfile.txt",ios: : out);//将代码译码后放入到文件中 inta=0; charc[500],ch=NULL; intk=0,m=0,i=0;//将CodeFile.txt文件的编码读入 fin>>c; for(i=0;i charstr[50]=""; charother[20]="";//用于存储每个叶子结点的编码,便于比较 fstreamtemp("tem.txt",ios: : out);//用于将整形编码转换成字符型,便于比较 for(k=code[i].start;k temp< } temp.close(); temp.open("tem.txt",ios: : in);//用文件实现整型和字符型的转换 temp>>str; k=len-code[i].start; for(inta=0;a other[a]=c[m+a]; if(! strcmp(str,other)){fout< cout< temp.close(); } fin.close(); fout.close(); remove("tem.txt");//将临时的文件删除 cout< cout< ! "< system("pause"); } //选做1: 实现印代码文件 voidPrint(){ fstreamfin("CodeFile.txt",ios: : in); fstreamfout("Codeprint.txt",ios: : out); charch; intsum=0; cout<<"印代码文件输出如下: "< while(fin.get(ch)! =NULL){//控制输出的字符个数 sum++; cout< fout< if(sum%50==0){cout< } fin.close(); fout.close(); cout< ! ! "< system("pause"); } //选做二: 用递归算法实现哈夫曼树的直观输出 fstreamfout("TreePrint.txt",ios: : out);//建立存储的文件 voidTreePrint(intm,intn){//递归算法实现哈夫曼树的输出 if(h[m].weight==0.0) {return;} TreePrint(h[m].rchild,n+1); for(inti=0;i printf(""); fout<<"";} cout< fout< TreePrint(h[m].lchild,n+1); } //主函数 voidmain(){//界面设计 cout< (2)班"<<'\t'<<"XXX"<<'\t'<<"2012329620050"< while (1){cout< cout<<'\t'<<"---------------------------------------------------------"< cout<<'\t'<<"<<赫夫曼编码/译码器>>"< cout<<'\t'<<"请输入你的选择"< cout<<'\t'<<"*********I: 建哈夫曼树*********"< cout<<'\t'<<"*********E: 编码*********"< cout<<'\t'<<"*********D: 译码*********"< cout<<'\t'<<"*********P: 印代码文件*********"< cout<<'\t'<<"*********T: 印赫夫曼树*********"< cout<<'\t'<<"*********Q: 退出*********"< cout<<'\t'<<"---------------------------------------------------------"< charchoose; cout<<"YourChoose(注意大写): "; cin>>choose; switch(choose){//功能选择 case'I': Initialization();break;//初始化哈夫曼树 case'E': Encoding();break;//哈夫曼编码 case'D': decoding();break;//哈夫曼译码 case'P': Print();break;//印代码文件 case'T': cout<<"输出的直观哈夫曼树如图: "< TreePrint(2*leaves-2,0); fout.close(); cout< ! ! "< cout< system("pause");break; case'Q': choose='Q';break;//退出 default: cout<<"输入错误,请重新选择! ! ! "< } if(choose=='Q')break;//用于判断结束跳出while循环 } } 六、调试分析 1)测试一 ✧开始界面 利用输
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 赫夫曼 编码