Huffman编码与解码.docx
- 文档编号:12652493
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:12
- 大小:121.09KB
Huffman编码与解码.docx
《Huffman编码与解码.docx》由会员分享,可在线阅读,更多相关《Huffman编码与解码.docx(12页珍藏版)》请在冰豆网上搜索。
Huffman编码与解码
《数据结构的课程设计》
报告
题目:
Huffman编码与解码
班级:
1612401
学号:
*********
*******
******
完成日期:
2014.1.3
一.需求分析.
二.程序主要功能.
三.程序运行平台.
四.程序类说明.
五.模块分析.
六.存在的不足与对策.
七.体验感悟
八.程序源代码.
需求分析
对一篇英文文章(大于2000个英文字符),统计各字符出现的次数,实现Huffman编码,以及对编码结果的解码。
程序主要功能
(1)输出每个字符出现的次数和编码,其中求最小权值要求用堆实现。
(2)在Huffman编码后,要将编码表和英文文章编码结果保存到文件中,编码结果必须是二进制形式,即01的信息用比特位表示,不能用字符’0’和’1’表示。
(3)提供读编码文件生成原文件的功能。
程序运行平台
该程序是用VC++6.0制做的,使用MicrosoftVisualC++6.0运行该程序,具体操作是:
打开MicrosoftVisualC++6.0,菜单栏里点文件→打开工作区→找到“图书管理系统.dsw”这个文件→打开,或者在资源管理器中双击该文件,此时,VC++6.0会自动打开,并载入该系统相关资源,点击Run命令菜单或者或用快捷键Ctrl+F5运行该程序。
trl计分析能
程序类说明
二叉树类记录
typedefstruct{
intweight,flag,parent;
charc;
intlchild,rchild;
}hnodetype;
赫夫曼类
typedefstruct{
intBit[3000];
intStart;
}hcodetype;
函数分析:
voidcreate(intT[])创建二叉树
voidVisit(inti,intn)显示元素的权值
intIN(inti,intn)中序遍历
voidhtree()赫夫曼解码
模块分析
我设计的系统,主要分为两大模块1编码模块2解码模块
该系统主要完成以下功能:
编码模块:
1从文章中读取信息
2构建赫夫曼树
3进行赫夫曼编码并保存在文件中
解码模块:
1从文件中读取赫夫曼码
2进行解码
3保存在文件中
文章信息
元素权值
赫夫曼解码结果
存在的不足与对策
由于自身能力有限,所以没有起到真正的压缩文件的功能。
在设计过程中由于设计者的编程功底欠缺,因此学习过程较为艰辛,需要解决的问题也比较多。
在以后的学习中,应该循序渐进,不可急于求成,先打好基础,这样才能更好地发展。
体验感悟
在编写程序的过程中,深切的体会到自身能力还有待提高,通过大规模的查询网上资料与相关书籍我学习到了很多以前不知道的编程方法与各种奇妙的函数语句时,提高了自己对程序设计本身的兴趣,更加乐意去学习这方面的新的东西,并在不断地自我挑战中收获着,或知识技能,或信心勇气。
希望自己在今后的学习中可以更好的完善自我。
程序源代码
#include
#include
#include"math.h"
#include
usingnamespacestd;
typedefstruct{
intweight,flag,parent;
charc;
intlchild,rchild;
}hnodetype;
typedefstruct{
intBit[3000];
intStart;
}hcodetype;
hnodetypeHuffnode[100],Htree[100];
hcodetypeHuffcode[100],cd,Ctree[2000];
intw[29];
voidcreate(intT[]){
charc;
intm=0;
fstreamfp;
fp.open("a.txt",ios:
:
in);
if(fp.fail())
{
cout<<"文件打开失败!
\n";
exit(0);
}
while(!
fp.eof()){
fp.get(c);
if(c<='z'&&c>='a')
T[c-'a']++;
if(c<='Z'&&c>='A')
T[c-'A']++;
if(c=='\n')
T[26]++;
if(c==',')
T[27]++;
if(c=='.')
T[28]++;
}
fp.close();
}
voidVisit(inti,intn){
if(i cout<<"元素"< } intIN(inti,intn){ if(Huffnode[i].lchild! =-1) IN(Huffnode[i].lchild,n); Visit(i,n); if(Huffnode[i].rchild! =-1) IN(Huffnode[i].rchild,n); return1; } voidmain(){ voidhtree(); inti,j,x1,x2,m1,m2,c,p; charz; create(w); for(i=0;i<2*29-1;i++){ Huffnode[i].weight=Huffnode[i].flag=Huffnode[i].parent=0; Huffnode[i].lchild=Huffnode[i].rchild=-1; } for(i=0;i<26;i++){ Huffnode[i].c=i+'a';Huffnode[i].weight=w[i]; } Huffnode[26].c='\n';Huffnode[26].weight=w[26]; Huffnode[27].c=',';Huffnode[27].weight=w[27]; Huffnode[28].c='.';Huffnode[28].weight=w[28]; for(i=0;i<29-1;i++){ m1=m2=3000;x1=x2=0; for(j=0;j<29+i;j++){ if((Huffnode[j].weight x2=x1; m2=m1; x1=j; m1=Huffnode[j].weight;} elseif((Huffnode[j].weight) x2=j; m2=Huffnode[j].weight;} } Huffnode[x1].parent=Huffnode[x2].parent=29+i; Huffnode[x1].flag=Huffnode[x2].flag=1; Huffnode[29+i].weight=m1+m2;Huffnode[29+i].lchild=x1;Huffnode[29+i].rchild=x2; } for(i=0;i<29;i++) { cd.Start=29-1; c=i; p=Huffnode[c].parent; while(p! =0){ if(Huffnode[p].lchild==c)cd.Bit[cd.Start]=0; elsecd.Bit[cd.Start]=1; cd.Start--; c=p; p=Huffnode[c].parent; } for(j=cd.Start+1;j<29;j++)Huffcode[i].Bit[j]=cd.Bit[j]; Huffcode[i].Start=cd.Start; } fstreamfp; fp.open("b.txt",ios: : out); if(! fp){ cout<<"文件打开失败! \n"; exit(0); } for(i=0;i<29;i++){ fp< fp< for(j=Huffcode[i].Start+1;j<29;j++) fp< fp<<"#\n"; } fp.close(); fstreamnode; node.open("c.txt",ios: : out); fp.open("a.txt",ios: : in); if(fp.fail()) { cout<<"文件打开失败! \n"; exit(0); } while(! fp.eof()){ fp.get(z); for(i=0;i<29;i++) if(z==Huffnode[i].c||z==Huffnode[i].c-32) for(j=Huffcode[i].Start+1;j<29;j++) node< node<<"#"; } fp.close(); node.close(); cout<<"递归中序遍历"< IN(2*29-2,29); htree(); } voidhtree(){ inti,j,k,n,l[2000]; charh; fstreamfp,w; fp.open("c.txt",ios: : in); if(! fp){ cout<<"文件打开失败! \n"; exit(0); } i=0; while(! fp.eof()){ for(l[i]=0;;l[i]++){ fp.get(h); if(h=='#')break; Ctree[i].Bit[l[i]]=(int)(h-'0'); } i++; } w.open("d.txt",ios: : out); if(! w){ cout<<"文件打开失败! \n"; exit(0); } for(j=0;j { if(l[j]==0)w<<""; else{ n=29*2-2; for(k=0;k if(Ctree[j].Bit[k]==1) n=Huffnode[n].rchild; if(Ctree[j].Bit[k]==0) n=Huffnode[n].lchild; } w< } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Huffman 编码 解码