哈夫曼编码实验报告_第1页
哈夫曼编码实验报告_第2页
哈夫曼编码实验报告_第3页
哈夫曼编码实验报告_第4页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、哈夫曼编码实验报告 实验报告与总结 一、 实验目得 1、掌握哈夫曼编码原理; 2、熟练掌握哈夫曼树得生成方法; 3、理解数据编码压缩与译码输出编码得实现. 二、实验要求 实现哈夫曼编码与译码得生成算法。 三、实验内容 先统计要压缩编码得文件中得字符字母出现得次数,按字符字母与空格出现得概率对其进行哈夫曼编码,然后读入要编码得文件,编码后存入另一个文件;接着再调出编码后得文件,并对其进行译码输出,最后存入另一个文件中。 五、实验原理 1、哈夫曼树得定义:假设有 n 个权值,试构造一颗有 n 个叶子节点得二叉树,每个叶子带权值为 wi,其中树带权路径最小得二叉树成为哈夫曼树或者最优二叉树; 2、哈

2、夫曼树得构造: w为输入得频率数组,把其中得值赋给依次建立得 h nod对象中得 dta 属性,即每一个 ht node 对应一个输入得频率。然后根据 dta 属性按从小到大顺序排序,每次从ata 取出两个最小与此次小得 ht node,将她们得 da相加,构造出新得tne 作为她们得父节点,指针 paret,lfd,rgtchil赋相应值。在把这个新得节点插入最小堆。按此步骤可以构造构造出一棵哈夫曼树。 通过已经构造出得哈夫曼树,自底向上,由频率节点开始向上寻找 pent,直到 pen为树得顶点为止。这样,根据每次向上搜索后,原节点为父节点得左孩子还就是右孩子,来记录或 0,这样,每个频率都

3、会有一个编码与之唯一对应,并且任何编码没有前部分就是同其她完整编码一样得。 六、实验流程 初始化,统计文本文件中各字符得个数作为权值,生成哈夫曼树; 根据符号概率得大小按由大到小顺序对符号进行排序; 把概率最小得两个符号组成一个节点; 重复步骤(2)(3),直到概率与为; 从根节点开始到相应于每个符号得"树叶',概率大得标"0',概率小得标"1' 从根节点开始,对符号进行编码; 译码时流程逆向进行,从文件中读出哈夫曼树,并利用哈夫曼树将编码序列解码。 七、实验程序 #incldeistrem #ncludefsteam incudeioma

4、nip #iluevecto usin naespace sd; type strct /节点结构 char dt; /记录字符值 重权符字录记/ ;hgiew ni gnol unsined in paret,lchld,rhil; htnoe,*ufare; /动态分配数组存储哈夫曼树 typdef har * *hufmancode; /动态分配数组存储哈夫曼编码表 void seet(huffmntree ht,int i,it s1,i 2) /在 ht1、t中选择parent 不为 0 且权值最小得两个结点,其序号分别为1 与 s2 ;2s;0=1 ;0003=2n,0003=n

5、tni f(int k=1;k=;k+) if(ht、par=0) )1ngie、kh(f n2=n1; 1=ht、weigt; 2=s1; s1=; le i(h、wihtn2) n2ht、weght; 2k; oid hfmacodin(huffmntree ht,ffmacode hc,nt n)/将要编码得字符串存入空树中 ifstra fi1('zifu、txt); ifstra fin2(weigt、txt'); if(n)retr; int 2*1; int i; ;1+edot wen=h ch zifu; n *weit; zifu= car+1; weigt

6、=new itn+1; 中组数 ufi在放符字得码编待将/)+i;n=i;1=(rf ;hc ah c=fin1、get(); ;h=iufi 中组数 thgiw 在放值权得应对符字码编带将/)+;n=i;1=i(of inwiti; or( i=1;;i+) ;iufiz=tad、ith ;ithgiewhgiw、h for(in+1;i=m;i+) i、dt=; )+;m=i;1(rf ht、pen=ti、child=h、rcid=0; )i+;m=i;1+n=i(rof ;s,1s ti sele(t,s1,2); hs1、paenti; t、paen=i; ;2s=dlihr、ith

7、;1slil、it ;the、2st+tgiew、1s=thgiew、it 间空作工得码编求个一辟开;)*rahc(oez)1+n(collam)onmffuh(=ch ;dc* rahc 值权放存间空辟开/;)ac(fez*(cllam)* rah(=dc cd-1="0; fr(i=1;i=;i+) ;1=tras tni ;f,c n for( =, f=hi、parent;f!=;c=f,f=hf、prent)/从叶子到根逆向求编码 if(tf、lcld=) cdstart=0;/若就是左孩子编为"0" le "1为编子孩右是就若/;"

8、1"asdc 分码编个第为/ ;)rah(ezs)trats-n(cllm)* ah(=ch配空间 strpy(hci,art); deet d; /释放工作空间 d prnhffntree(uffmee ht,nt ) /显示有 n 个叶子结点得哈夫曼树得编码表 ostream fout(hmtree、txt); /将对应字符得得哈弗曼树存入 ''tnerap' 'thiw'' atd'' 'muntuoclchild' 'rchlid'ndl; o(int i=;i=*n1;+) fo

9、ti、eigtetw(3)i、paetsew()h、cilstw(3)hi、hldendl; thgew、th)3(waad、it)5(esitetw(3)hi、pntstw()hti、lchildsew(3)hti、childndl; vod printhuffmancodig(uffmnree ht,hufncode c,nt n)/输出字符得对应哈弗曼编码并存入 code、xt 文件 cthufman ce is:'endl; ;)'xt、eoc'(tuof maertsfo fo(in =;i=n;i+) cuthti、aa' - ; ;ldne)ch(

10、tuoc ;ldne)ich(tuo vo co_ ht,hufmae hc,it n)/对文件 tbern、txt 进行编码,并将编码存入 codefile 文件中 ifsam fin(oran、txt); ;)'do'(tof aertsfo ;a ahcrce ;c rhc )*"=!)(teg、if=hc(el 、puhback(c); cout待编码得字符串为:; )+k;)(eis、a;= tni(rof ;ku ;ldnetuoc ;l:果结码编 ntoc )+i;)(eis、i;0=i ni(rof )+;n=j;1j tni(rof )atad、jh

11、=ia(i fhj; ;kaerb fi、clos(); ;)(eoc、tof void decodi(humatr ,huffmanod c,i )/打开 codeile 文件并对文件内容进行译码 in os m*n1; istream fin(code'); ;)txet(tuof atfo vetrcar a; );cnf; h(of a、ps_bac(c); ;0=tc tni fo(int k=0;ka、ze();+) oak; cont+; if(ont%5=0) ;ldnto int =0; 值得 m 住记来 p 用/ ;p tni otenl; out'n 译码

12、结果:'endl; while(ia、se() 历遍始开根得数曼弗哈从 ;= )dlil、th(ei )1=a(fi ;dlhcr、pth ls ;ihcl、pt=p ;+i fohtp、ata; ;ta、pthtuoc od main() t n; out'输入权值个数:' /设置权值数值 ;nic ;)n'(ftnir th 树曼夫哈/ ;t eertffuh c表码编曼夫哈/ ;ch ednamffuh 码编曼夫哈行进/ ;)n,h,th(nidocnauh rithufancodig(ht,,n); 显示编码得字符 ;)(tnir ode_); /显示要

13、编码得字符串,并把编码值显示出来 串符字得后码译示显并码译/ ;)n,ch,h(gnioce ;)'n'(fip ;)euap(mtsys 八、结果分析 哈夫曼编码就是动态变长编码,临时建立概率统计表与编码树。概率小得码比较长,概率小得码比较长。概率大得码短,这样把一篇文件编码后,就会压缩许多。从树得角度瞧,哈夫曼编码方式就是尽量把短码都利用上。首先,把一阶节点全都用上,如果码字不够时,然后,再从某个节点伸出若干枝,引出二阶节点作为码字,以此类推,显然所得码长最短,再根据建立得概率统计表合理分布与放置,使其平均码长最短就可以得到最佳码。 九、实验总结 通过这次实验,我对二叉树与

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论