数据结构实验报告《五、最优二叉树应用之哈夫曼编译码》
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告《五、最优二叉树应用之哈夫曼编译
码》
数据结构实验报告- - - -
最优二叉树运用--哈夫曼编/译码
专业班级:电信0903
时间:2011年11月27日
数据结构实验报告----
最优二叉树运用--哈夫曼编/译码【问题描述】
例3(实验二方案3):设字符集为26个英文字母,其出现频度如下表所示。
先建哈夫曼树,再利用此树对报文“This program is my favorite”进行编码和译码。
注:若圆满实现了此方案,平时成绩将以满分计。
字符 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 【基本要求】
哈夫曼编/译码的功能是:
(1) I:初始化(Initialization)。
从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中。
(2) E:编码(Encoding)。
利用已建好的赫夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
(3) D:译码(Decoding)。
利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。
【运用拓展】
(1) 编码结果以文本方式存储在文件Codefile中,
(2) 仿真友好界面,用户界面可以设计为“菜单”方式,通过人机交互方式使用本程序,从而更加方便友好;
【设计思路分析】
1、将哈夫曼树节点的数据类型定义为: ?
typedef struct{ //赫夫曼树的结构体
char ch;
int weight; //权值
int parent,lchild,rchild;
}htnode,*hfmtree;
2、功能函数模块划分 ?
1、void HfmCoding(HfmTree &HT,HfmCode &HC,int n)初始化哈夫曼树,按照哈夫曼规则建立2叉树。
此函数块调用了Select()函数。
2、void HfmSelect(HfmTree &HT,int a,int *p1,int *p2)该函数,选出HT
树到a为止,权值最小且parent为0的2个节点
3、主函数: 利用已建好的哈夫曼树(如不在内存,则从文件hfmtree.txt中读入) 对文件中的正文进行编码,然后将结果存入文件codefile.txt中。
如果正文中没有要编码的字符,则键盘读入并存储到ToBeTran文件中。
读入ToBeTran中将要编码的内容,将编码好的哈夫曼编码存储到CodeFile中。
4、编码功能:对输入字符进行编码
5、译码功能: 利用已建好的哈夫曼树将文件codefile.txt中的代码进行译码,结果存入文件textfile.dat 中。
6、主函数的简要说明,主函数主要设计的是一个分支语句,让用户挑选所实现的功能。
使用链树存储,然后分别调用统计频数函数,排序函数,建立哈夫曼函数,编码函数,译码函数来实现功能。
【主函数流程图】
开始
否初始化树,
是
统计字符总数
统计字符种类及频率
建立哈夫曼树
哈夫曼编码
哈夫曼译码
结束
【运行环境】
电脑环境:Windows 7 & Windows XP & Windows vista
软件环境:Visual C++ 6.0 & Visual studio 2008
【实验前分析】
为清晰起见,重新排序为:
W0={1,1,1,1,5,8,13,15,15,16,18,20,21,22,23,32,32,47,48,51,57,57,63,6 4,80,103,186}
W1={1,1,2,5,8,13,15,15,16,18,20,21,22,23,32,32,47,48,51,57,57,63,64,80,1 03,186}
W2={2,2,5,8,13,15,15,16,18,20,21,22,23,32,32,47,48,51,57,57,63,64,80,103 ,186}
W3={4,5,8,13,15,15,16,18,20,21,22,23,32,32,47,48,51,57,57,63,64,80,103,1 86}
W4={8,9,13,15,15,16,18,20,21,22,23,32,32,47,48,51,57,57,63,64,80,103,186} W5={13,15,15,16,17,18,20,21,22,23,32,32,47,48,51,57,57,63,64,80,103,186} W6={15,16,17,18,20,21,22,23,28,32,32,47,48,51,57,57,63,64,80,103,186}
W7={17,18,20,21,22,23,28,31,32,32,47,48,51,57,57,63,64,80,103,186}
W8={20,21,22,23,28,31,32,32,35,47,48,51,57,57,63,64,80,103,186}
W9={22,23,28,31,32,32,35,41,47,48,51,57,57,63,64,80,103,186}
Wa={28,31,32,32,35,41,45,47,48,51,57,57,63,64,80,103,186} Wb={32,32,35,41,45,47,48,51,57,57,59,63,64,80,103,186}
Wc={35,41,45,47,48,51,57,57,59,63,64,64,80,103,186}
Wd={45,47,48,51,57,57,59,63,64,64,76,80,103,186}
We={48,51,57,57,59,63,64,64,76,80,92,103,186}
Wf={57,57,59,63,64,64,76,80,92,99,103,186}
Wg={59,63,64,64,76,80,92,99,103,114,186}
Wh={64,64,76,80,92,99,103,114,122,186}
Wi={76,80,92,99,103,114,122,128,186}
Wj={92,99,103,114,122,128,156,186}
Wk={103,114,122,128,156,186,191}
Wk={122,128,156,186,191,217}
Wk={156,186,191,217,250}
Wk={191,217,250,342}
Wk={250,342,408}
Wk={408,592}
Wk={1000}
【执行程序】
1、初始化哈夫曼树并建立
2、输入建立哈夫曼树:
3、输出编码表:
4、进行编码:
5、进行译码:
6、错误操作:
7、退出
【参考文献】
1( 《数据结构(C 语言版) 严蔚敏,吴伟民清华大学出版社》 2( 《数据结构题集(C 语言版) 严蔚敏,吴伟民,米宁清华大学出版社》 3( 《C++程序设计》杨长兴,刘卫国中国铁道出版社。