哈夫曼编码实验报告.docx

上传人:b****7 文档编号:9819087 上传时间:2023-02-06 格式:DOCX 页数:8 大小:19.18KB
下载 相关 举报
哈夫曼编码实验报告.docx_第1页
第1页 / 共8页
哈夫曼编码实验报告.docx_第2页
第2页 / 共8页
哈夫曼编码实验报告.docx_第3页
第3页 / 共8页
哈夫曼编码实验报告.docx_第4页
第4页 / 共8页
哈夫曼编码实验报告.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

哈夫曼编码实验报告.docx

《哈夫曼编码实验报告.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码实验报告.docx(8页珍藏版)》请在冰豆网上搜索。

哈夫曼编码实验报告.docx

哈夫曼编码实验报告

哈夫曼编码实验报告

实验报告与总结一、实验目得

1、掌握哈夫曼编码原理;2、熟练掌握哈夫曼树得生成方法; 3、理解数据编码压缩与译码输出编码得实现.

二、实验要求

实现哈夫曼编码与译码得生成算法。

三、实验内容先统计要压缩编码得文件中得字符字母出现得次数,按字符字母与空格出现得概率对其进行哈夫曼编码,然后读入要编码得文件,编码后存入另一个文件;接着再调出编码后得文件,并对其进行译码输出,最后存入另一个文件中。

五、实验原理1、哈夫曼树得定义:

假设有n个权值,试构造一颗有n个叶子节点得二叉树,每个叶子带权值为wi,其中树带权路径最小得二叉树成为哈夫曼树或者最优二叉树;2、哈夫曼树得构造:

weight为输入得频率数组,把其中得值赋给依次建立得HTNode对象中得data属性,即每一个HTNode对应一个输入得频率。

然后根据data属性按从小到大顺序排序,每次从data取出两个最小与此次小得HTNode,将她们得data相加,构造出新得HTNode作为她们得父节点,指针parent,leftchild,rightchild赋相应值。

在把这个新得节点插入最小堆。

按此步骤可以构造构造出一棵哈夫曼树。

通过已经构造出得哈夫曼树,自底向上,由频率节点开始向上寻找parent,直到parent为树得顶点为止。

这样,根据每次向上搜索后,原节点为父节点得左孩子还就是右孩子,来记录1或0,这样,每个频率都会有一个01编码与之唯一对应,并且任何编码没有前部分就是同其她完整编码一样得。

六、实验流程

①初始化,统计文本文件中各字符得个数作为权值,生成哈夫曼树;②根据符号概率得大小按由大到小顺序对符号进行排序; ③把概率最小得两个符号组成一个节点;④重复步骤

(2)(3),直到概率与为1;⑤从根节点开始到相应于每个符号得“树叶”,概率大得标“0”,概率小得标“1”;⑥从根节点开始,对符号进行编码;⑦译码时流程逆向进行,从文件中读出哈夫曼树,并利用哈夫曼树将编码序列解码。

七、实验程序

#include〈iostream〉#include〈fstream>#include

usingnamespacestd;typedefstruct

//节点结构{

chardata;

//记录字符值

重权符字录记//

;thgiewtnignolﻩunsignedintparent,lchild,rchild;}HTNode,_HuffmanTree;

//动态分配数组存储哈夫曼树typedefchar_

_HuffmanCode; //动态分配数组存储哈夫曼编码表voidSelect(HuffmanTree;HT,inti,int;s1,int;s2)

//在HT[1、、、t]中选择parent不为0且权值最小得两个结点,其序号分别为s1与s2

{

;0=2s;0=1sﻩ;00003=2n,00003=1ntniﻩfor(intk=1;k<=i;k++)

{ﻩ

if(HT[k]、parent==0)

{

)1n<thgiew、]k[TH(fiﻩﻩ

{

ﻩﻩﻩn2=n1;n1=HT[k]、weight;

ﻩﻩﻩs2=s1;s1=k; }

esleﻩ

if(HT[k]、weight〈n2)

{ﻩﻩﻩ

n2=HT[k]、weight; ﻩﻩ

s2=k;

ﻩ}

}ﻩ}ﻩ}voidHuffmanCoding(HuffmanTree&HT,HuffmanCode;HC,intn)//将要编码得字符串存入空树中{

ifstreamfin1(zifu、t_t"); ifstreamfin2("weight、t_t); if(n〈=1)return; intm=2_n;1; inti; ;]1+m[edoNTHwen=THﻩchar*zifu; int_weight; zifu=newchar[n+1];

weight=newint[n+1];

中组数ufiz在放符字得码编待将//)++i;n=〈i;1=i(rofﻩ

{ﻩ;hcrahcﻩﻩ

ch=fin1、get();

;hc=]i[ufizﻩﻩ}

中组数thgiew在放值权得应对符字码编带将//)++i;n=〈i;1=i(rofﻩ{ﻩ

fin2〉〉weight[i];

}

for(i=1;i〈=n;i++)

;]i[ufiz=atad、]i[THﻩ;]i[thgiew=thgiew、]i[THﻩﻩ}ﻩfor(i=n+1;i<=m;i++)

{

HT[i]、data=��';

}ﻩ)++i;m=〈i;1=i(rofﻩ{

HT[i]、parent=HT[i]、lchild=HT[i]、rchild=0; }ﻩ)i++;m=

;2s,1stniﻩﻩ

Select(HT,i;1,s1,s2); HT[s1]、parent=i;

HT[s2]、parent=i; ;2s=dlihcr、]i[TH

;1s=dlihcl、]i[THﻩﻩ;thgiew、]2s[TH+thgiew、]1s[TH=thgiew、]i[THﻩﻩ}

间空作工得码编求个一辟开;))_rahc(foezis*)1+n((collam)edoCnamffuH(=CHﻩ;dc_

rahcﻩ值权放存间空辟开//;))rahc(foezis_n(collam)_

rahc(=dcﻩcd[n-1]="\0��;for(i=1;i<=n;i++){

;1-n=tratstniﻩ

;f,ctniﻩ

for(c=i,f=HT[i]、parent;f!

=0;c=f,f=HT[f]、parent)//从叶子到根逆向求编码

{

ﻩif(HT[f]、lchild==c)

ﻩcd[;-start]=��0��;//若就是左孩子编为"0"

esleﻩﻩ

"1��为编子孩右是就若//;"1"=]trats;-[dcﻩﻩ

}ﻩﻩ分码编个i第为//

;))rahc(foezis*)trats-n((collam)_

rahc(=]i[CHﻩ配空间

strcpy(HC[i],;cd[start]);

}ﻩdelete[]cd; //释放工作空间}voidprintHuffmanTree(HuffmanTreeHT,intn)

//显示有n个叶子结点得哈夫曼树得编码表{

ofstreamfout(“hfmtree、t_t");

//将对应字符得得哈弗曼树存入”

<〈tnerap“<<

<<”thgiew〈<

“〈<”atad〈〈

"〈〈MUN“<〈tuocﻩ〈<"lchild”<<

<〈“rchlid〈〈endl;

for(inti=1;i<=2_n;1;i++)

{

ﻩfout<〈HT[i]、weight〈〈setw(3)〈<HT[i]、parent〈〈setw(3)<<HT[i]、lchild<

}}voidprintHuffmanCoding(HuffmanTreeHT,HuffmanCodeHC,intn)//输出字符得对应哈弗曼编码并存入code、t_t文件{

cout<〈”Huffmancodeis:

<〈endl;

;)t_t、edoc(tuofmaertsfoﻩfor(inti=1;i<=n;i++)

{ﻩ

cout<〈HT[i]、data<<;->";

;ldne〈<)]i[CH(<

HT,HuffmanCodeHC,intn)//对文件tobetran、t_t进行编码,并将编码存入codefile文件中{

ifstreamfin(“tobetran、t_t"); ;)edoc(tuofmaertsfoﻩ;a〉rahc〈rotcevﻩ;hcrahcﻩ)��_"=!

))(teg、nif=hc((elihwﻩ

a、push_back(ch);

cout〈<”待编码得字符串为:

“; )++k;)(ezis、a<k;0=ktni(rofﻩ;]k[a〈〈tuocﻩﻩ

;ldne〈〈tuocﻩ;ldne<<”:

果结码编n\"〈〈tuocﻩ)++i;)(ezis、a〈i;0=itni(rofﻩ{

)++j;n=〈j;1=jtni(rofﻩ{ﻩﻩﻩ)atad、]j[TH==]i[a(fiﻩ

{ﻩﻩ

fout〈<HC[j];

;kaerbﻩﻩ

ﻩ}

}ﻩfin、close();

;)(esolc、tuofﻩ}voidDecoding(HuffmanTreeHT,HuffmanCodeHC,intn)//打开codefile文件并对文件内容进行译码{

intconstm=2_n;1;

ifstreamfin("code);

;)“t_et”(tuofmaertsfoﻩvector

);c>>nif;crahc(rofﻩ

a、push_back(c);

;0=tnuoctniﻩfor(intk=0;k

{

ﻩcout〈〈a[k]; ﻩcount++; ﻩif(count%50==0)

ﻩ;ldne〈

值得m住记来p用//

;ptniﻩcout<〈endl; cout<<\n译码结果:

<〈endl;

while(i〈a、size)

{ﻩ历遍始开根得数曼弗哈从//

;m=pﻩﻩ

)dlihcl、]p[TH(elihwﻩ

{

)��1��==]i[a(fiﻩ

;dlihcr、]p[TH=pﻩﻩ

else

ﻩ;dlihcl、]p[TH=pﻩ

;++iﻩ

ﻩfout<

;atad、]p[TH〈〈tuocﻩ}}voidmain{

intn;

cout<<输入权值个数:

;

//设置权值数值

;n>〉nicﻩ;)“n\(ftnirpﻩTH树曼夫哈//

;THeerTnamffuHﻩCH表码编曼夫哈//

;CHedoCnamffuHﻩ码编曼夫哈行进//

;)n,CH,TH(gnidoCnamffuHﻩprintHuffmanCoding(HT,HC,n);

//显示编码得字符

;)”n\“(ftnirpﻩcode_); //显示要编码得字符串,并把编码值显示出来

串符字得后码译示显并码译//

;)n,CH,TH(gnidoceDﻩ;)n\n\n\(ftnirpﻩ;)”esuap"(metsysﻩ}

八、结果分析哈夫曼编码就是动态变长编码,临时建立概率统计表与编码树。

概率小得码比较长,概率小得码比较长。

概率大得码短,这样把一篇文件编码后,就会压缩许多。

从树得角度瞧,哈夫曼编码方式就是尽量把短码都利用上。

首先,把一阶节点全都用上,如果码字不够时,然后,再从某个节点伸出若干枝,引出二阶节点作为码字,以此类推,显然所得码长最短,再根据建立得概率统计表合理分布与放置,使其平均码长最短就可以得到最佳码。

九、实验总结

通过这次实验,我对二叉树与哈希曼树有了更好得认识。

在实验过程中,我掌握了哈曼树得构造方法,学会了如何将理论知识传换成实际应用。

同时,在解决程序中遇到得一些问题得同时,我也对调试技巧有了更好得掌握,分析问题得能力也略有提高.

在实验中,我遇到了许多难点,比如:

统计字符得权值,就需要我们有扎实得基础,需要有灵活得头脑,只有不断得练习,不断得训练,我们才能处理各种问题.在以后得学习中,我要不断得努力,多联系,多思考,我相信我能有所进步得。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1