哈夫曼树实验报告.docx
- 文档编号:395993
- 上传时间:2022-10-09
- 格式:DOCX
- 页数:10
- 大小:42.61KB
哈夫曼树实验报告.docx
《哈夫曼树实验报告.docx》由会员分享,可在线阅读,更多相关《哈夫曼树实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
哈夫曼树实验报告
哈夫曼树实验报告
一、问题描述
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将穿来的数据进行译码,此试验即设计这样的一个简单的编/译码系统。
系统应该具有如下的几个功能。
1.接受原始数据
从终端任意读入字母,求出其各自的权重值,建立哈夫曼树,并将它存于hfmtree.dat文
件中。
2.编码
利用已建好的哈夫曼树,对文件中的正文进行编码,然后将结果存入codefile.dat中。
3.译码
利用已建好的哈夫曼树将文件codefile.dat中的代码进行译码,结果存入文件textfile.dat
中。
4.打印编码规则
即字符与编码的一一对应关系。
5.打印哈夫曼树
将已存在内存中的哈夫曼树以直观的方式显示在终端上。
二、数据结构设计
1.构造哈夫曼树时使用静态量表作为哈夫曼树的存储。
在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各节点的信息,
根据二叉树的性质可知,具有n个叶子节点的哈夫曼树共有2n-1个结点,所以数组
HuffNode的大小设置为2n-1,描述节点的数据类型为:
typedefstruct
{
intweight;//结点权值
intparent;
intlchild;
intrchild;
}HNodeType;
2.求哈夫曼编码时使用一位结构数组HuffCode作为哈腹满编码信息的存储。
求哈夫曼编码,实质上就是在以建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域退到根结点,每退回一步,就走过了哈夫满树的一个分支,从而得到一位哈夫曼码值,由于一个字符的哈夫曼编码是从根结点到相应叶子结点所经过的路径上各分支所组成的0、1序列,因此先得到的分支代码为所求编码的低位码,后得到的分支代码为所求编码的高位码,所以设计如下数据类型:
typedefstruct
{
intbit[26];
intstart;
}HCodeType;
3.文件hfmtree.dat、codefile.dat、和textfile.dat。
三、代码实现
#include
#include
usingnamespacestd;#defineMaxvalu100typedefstruct
{
intweight;
intparent;
intlchild;
intrchild;
}HNodeType;
typedefstruct
{
intw;
charx;
}CNode;
typedefstruct
{
intbit[26];
intstart;
}HCodeType;
voidHuffmanTree(intn,CNodec[],HNodeType*HuffNode[])
{
inti,m1,m2,x1,x2,j;
for(i=0;i { HuffNode[i]->weight=c[i].w; } for(i=0;i { m1=m2=Maxvalu; x1=x2=0; for(j=0;j { if(HuffNode[j]->parent==-1&&HuffNode[j]->weight { m2=m1; x2=x1; m1=HuffNode[j]->weight; x1=j; } else if(HuffNode[j]->parent==-1&&HuffNode[j]->weight { m2=HuffNode[j]->weight; x2=j; } } HuffNode[x1]->parent=n+i; HuffNode[x2]->parent=n+i; HuffNode[n+i]->weight=HuffNode[x1]->weight+HuffNode[x2]->weight; HuffNode[n+i]->lchild=x1; HuffNode[n+i]->rchild=x2; } cout<<"哈夫曼二叉树为: "< for(i=0;i<2*n-1;i++) { cout< "< } } voidHaffmanCode(intn,CNodec[],HNodeType*HuffNode[]) { HCodeTypeHuffCode[26],cd; inti,a,p,j,q=2*(n-1); ofstreamoutfile("file3.txt",ios: : out); if(! outfile) { cerr<<"打开文件file3.txt失败~"< exit(0); } for(i=0;i { cd.start=n-1; a=i; p=HuffNode[a]->parent; while(p! =-1) { if(HuffNode[p]->lchild==a) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; a=p; p=HuffNode[a]->parent; } for(j=cd.start+1;j HuffCode[i].bit[j]=cd.bit[j]; HuffCode[i].start=cd.start; } outfile<<"哈夫曼编码为: "< for(i=0;i { outfile< "; for(j=HuffCode[i].start+1;j { outfile< } outfile< } outfile.close(); } voidHaffmanDecode(intn,CNodec[],HNodeType*HuffNode[]) { inti,j,p,a[50],m; ofstreamoutfile("file4.txt",ios: : out); if(! outfile) { cerr<<"打开文件file4.txt失败~"< exit(0); } cout<<"请输入哈夫曼译码的代号:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼树 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)