哈夫曼树 课程设计报告.docx
- 文档编号:5508602
- 上传时间:2022-12-17
- 格式:DOCX
- 页数:12
- 大小:144.72KB
哈夫曼树 课程设计报告.docx
《哈夫曼树 课程设计报告.docx》由会员分享,可在线阅读,更多相关《哈夫曼树 课程设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
哈夫曼树课程设计报告
数据结构课程设计报告
题目:
哈夫曼树及其应用
*******
学号:
**********
班级:
10211116
******
2012年6月3日
1、需求分析说明~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~3
2、总体设计~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~4
3、详细设计~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~5
4、实现部分~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~7
5、程序测试~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~9
6、总结~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~10
一.需求分析说明
设计目的:
熟悉树的各种存储结构及其特点。
掌握建立哈夫曼树和哈夫曼编码的方法及带权路径长度的计算。
设计内容
数据的读入﹑存储,生成文件,将键盘输入的信息存入指定的文件中;设计一程序求解此问题.哈夫曼(Huffman)编码原理是一种利用二叉树实现的编码原理
哈夫曼(Huffman)编码是1952年为文本文件而建立,是一种统计编码。
属于无损压缩编码。
哈夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短;而对于出现频率低的信息,编码长度较长。
这样,处理全部信息的总码长一定小于实际信息的符号长度。
锻炼我们的编码能力,真正理解数据结构的编码思想,并且锻炼我们的动手能力和成员间的配合,提高程序编写能力。
在信息传递时,希望长度能尽可能短,即采用最短码。
哈夫曼编码的应用,就是采用这种有效的数据压缩技术可以节省数据文件的存储空间和计算机网络的传送时间。
二.总体设计
(1).初始化:
提示初始化界面→提示各字符及其权值将存放在hfmTree中→以字母出现次数为权值建立哈弗曼树→弹出选择菜单进行进一步操作;
(2).编码:
弹出编码界面→读取文件→提示输入要编码的字符串→对文本进行哈弗曼编码并输出编码→保存编码文件;
(3).译码:
弹出译码界面→利用建立好的哈弗曼树进行译码→将译码输出→保存译码文件;
三.详细设计
1.数据结构设计
#include
#include
#include
constintn=6;//叶子数目
constintm=2*n-1;//森林中树的棵树
constintc=4;
classtree
{
public:
chardata;
intweight;//权值
intparent;//双亲
intlch,rch;//左右孩子
voidcreathafumantree();//建立哈夫曼树
voideditcode();//编码函数
voidtrancode(charb[],intmax);//译码函数
};
2.算法设计
哈夫曼树编码算法:
输入字符,权值算法:
输入一些字符,然后再输入相对应数量的权值,建哈夫曼树,然后进行编码,并得到相对应的哈夫曼编码。
voidtree:
:
editcode(){//编码
inti,j,k,f,count=0;
intcode[n+1][c+1];
for(i=1;i<=n;i++)
for(j=1;j<=c;j++)
code[i][j]=2;
for(i=1;i<=n;i++)
{
k=1;
j=hftree[i].parent;
f=i;
while(j!
=0)
{
if(hftree[j].lch==f)
{code[i][k++]=0;}
else
{code[i][k++]=1;}
j=hftree[j].parent;f=hftree[f].parent;
}
}
cout< for(i=1;i<=n;i++){ cout<<"权值为"< "<<""; for(j=c;j>=1;j--) { if(code[i][j]! =2) { cout< count+=1; } } cout< } count=count/n; cout<<"平均编码的长度为: "< } 哈夫曼树译码算法: 译码: 弹出译码界面→利用建立好的哈弗曼树进行译码→将译码输出→保存译码文件 voidtree: : trancode(charb[],intmax){//译码 inti=0; intj=m; cout<<"该段代码编译为: "< while(b[i]! ='\0'){ if(b[i]=='0') j=hftree[j].lch; else j=hftree[j].rch; if(hftree[j].lch==0&&hftree[j].rch==0) { cout< j=m; } i++; } } 四.实现部分 classtree { public: chardata; intweight;//权值 intparent;//双亲 intlch,rch;//左右孩子 voidcreathafumantree();//建立哈夫曼树 voideditcode();//编码函数 voidtrancode(charb[],intmax);//译码函数 }; voidtree: : editcode(){//编码 inti,j,k,f,count=0; intcode[n+1][c+1]; for(i=1;i<=n;i++) for(j=1;j<=c;j++) code[i][j]=2; for(i=1;i<=n;i++) { k=1; j=hftree[i].parent; f=i; while(j! =0) { if(hftree[j].lch==f) {code[i][k++]=0;} else {code[i][k++]=1;} j=hftree[j].parent;f=hftree[f].parent; } } cout< for(i=1;i<=n;i++){ cout<<"权值为"< "<<""; for(j=c;j>=1;j--) { if(code[i][j]! =2) { cout< count+=1; } } cout< } count=count/n; cout<<"平均编码的长度为: "< } voidtree: : trancode(charb[],intmax){//译码 inti=0; intj=m; cout<<"该段代码编译为: "< while(b[i]! ='\0'){ if(b[i]=='0') j=hftree[j].lch; else j=hftree[j].rch; if(hftree[j].lch==0&&hftree[j].rch==0) { cout< j=m; } i++; } } 五.程序测试 1.menu菜单图 2.输入各值并生成编码图 3.输入编码生成译码图 六.总结 1.设计体会 当刚拿到程序课题时,一看,感觉都挺容易的,都是我们学过的一些内容,应该很容易完成,于是就从中选了一个哈夫曼树的应用。 结果一作才知道,并不如我们想的那么容易。 对于建立哈夫曼树,创建哈夫曼编码等算法,总是因一点不对而编译不成功。 2.心得体会 通过数据结构课程设计,我的c++语言水平有了比较大的提高,其中c++语言关于类的操作理解的比以前深刻不少。 另外是数据结构方面的提高,对哈夫曼树的构造,及哈夫曼码方面也有不少的提高。 在项目中也出现了很多的问题,最大的问题就是对程序设计框架结构的不了解,在实现代码与功能的连接时经常会出现各种不同的错误,在实现一些功能时系统常常会报错。 许多错误不知从哪修改,以致托了整个设计的后腿。 课程设计中,既回顾了很多以前的东西,也发现了很多的问题,以前都没遇见过的,收获很大。 通过本次数据结构的课程设计,我学习了很多在上课没懂的知识,并对求哈夫曼树及哈夫曼编码/译码的算法有了更加深刻的了解,更巩固了课堂中学习有关于哈夫曼编码的知识,此次哈夫曼树的应用系统的设计让自己对数据结构的了解更深入。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼树 课程设计报告 课程设计 报告
