ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:80.80KB ,
资源ID:20244813      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20244813.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(信息论与编码课程设计哈夫曼编码的分析与实现文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

信息论与编码课程设计哈夫曼编码的分析与实现文档格式.docx

1、 (3)对重新排列后的两个最小符号重复步骤(2)的过程。 (4)不断重复上述过程,知道最后两个符号配以0和1为止。 (5)从最后一级开始,向前返回得到的各个信源符号所对应的码元序列,即为相应的码字。4.2哈夫曼编码特点哈夫曼编码是用概率匹配的方法进行信源匹配方法进行信源。它的特点是:(1)哈夫曼的编码方法保证了概率大的符号对应于短码,概率小的符号对应于长码,充分应用了短码。(2)缩减信源的最后两个码字总是最后一位不同,从而保证了哈夫曼编码是即时码。(3)哈夫曼编码所形成的码字不是唯一的,但编码效率是唯一的,在对最小的两个速率符号赋值时可以规定大的为“1”,小得为“0”,如果两个符号的出现概率相

2、等时,排列时无论哪个在前都可以,所以哈夫曼所构造的码字不是唯一的,对于同一个信息源,无论上述的顺序如何排列,他的平均码长是不会改变的,所以编码效率是唯一的。(4)只有当信息源各符号出现的概率很不平均的时候,哈夫曼编码的效果才明显。(5)哈夫曼编码必须精确的统计出原始文件中每个符号出现频率,如果没有这些精确的统计将达不到预期效果。哈夫曼编码通常要经过两遍操作 ,第一遍进行统计,第二遍产生编码,所以编码速度相对慢。另外实现电路复杂,各种长度的编码的编译过程也是比较复杂的,因此解压缩的过程也比较慢。(6)哈夫曼编码只能用整数来表示单个符号,而不能用小数,这很大程度上限制了压缩效果。哈夫曼所有位都是合

3、在一起的,如果改动其中一位就可以使其数据变得面目全非。五、设计步骤5.1以框图形式画出哈夫曼编码过程(哈夫曼编码要求构建哈夫曼树)。表1 哈夫曼编码信源编码概率编码过程码字码长X10.4 0.4 0.4 0.4 0.4 0.4 0.6 0 1.0 0.18 0.18 0.19 0.23 0.37 0 0.4 1 0.1 0.13 0.18 0.19 0 0.23 1 0.1 0.1 0.13 0 0.18 1 0.09 0.1 0 0.1 1 0.07 0 0.09 1 0.06 11X20.180013X30.1011X400004X50.070100X60.060101X70.050001

4、05X80.0400011哈夫曼树:给定n个实数w1,w2,wn(n2),求一个具有n个结点的二叉数,使其带权路径长度最小。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度为WPL=(W1*L1+W2*L2+W3*L3+.+Wn*Ln),N个权值Wi(i=1,2,.n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,.n)。可以证明哈夫曼树的WPL是最小的。(1) 根据与n个权值w1,w2wn对应的n个结点构成具有n棵二叉树的森林F=T1,T2Tn,其中第i棵二叉树Ti(

5、1 i n)都只有一个权值为wi的根结点,其左、右子树均为空。(2) 在森林F中选出两棵根结点的权值最小的树作为一棵新树的左、右子树,且置新树的根结点的权值为其左、右子树上根结点权值之和。(3)从F中删除构成新树的那两棵,同时把新树加入F中。(4)重复第(2)和第(3)步,直到F中只含有一棵为止,此树便为Huffman树。图1哈夫曼树5.2计算平均码长、编码效率、冗余度。平均码长为: =0.41+0.183+0.14+0.074+0.064+0.055+0.045=2.61(码元/符号) 信源熵为: -(0.4log0.4+0.18log0.18+0.1log0.1+0.1log0.1+0.0

6、7+log0.07+0.06log0.06+0.05log0.05+0.04log0.04)=2.55bit/符号信息传输速率为: R=0.977bit/码元编码效率为:=0.977冗余度为:=1-=1-0.977=0.023六、哈夫曼编码的实现6.1软件介绍 Visual C+ 6.0,简称VC或者VC6.0,是微软推出的一款C+编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。Visual C+是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C+1.0后,随着其新版本的不断问世,Visual C+已成为专业程序员进行软件开发的首选工具。Vi

7、sual C+6.0由Microsoft开发, 它不仅是一个C+ 编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C+6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Microsoft的主力软件产品。Visual C+6.0以拥有“语法高亮”,自动编译功能以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试

8、期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及创建预编译头文件(stdafx.h)、最小重建功能及累加连结(link)著称。这些特征明显缩短程序编辑、编译及连结的时间花费,在大型软件计划上尤其显著。(1)Developer Studio这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“Microsoft Visual C+”,所以很多人理所当然的认为,那就是Visual C+了。其实不然,虽然Developer Studio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能,真正完成这些工作的幕后英雄后面会介绍

9、。我们也知道,Developer Studio并不是专门用于VC的,它也同样用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio当成Visual C+, 它充其量只是Visual C+的一个壳子而已。这一点请切记!(2)MFC从理论上来讲,MFC也不是专用于Visual C+,Borland C+,C+Builder和Symantec C+同样可以处理MFC。同时,用Visual C+编写代码也并不意味着一定要用MFC,只要愿意,用Visual C+来编写SDK程序,或者使用STL,ATL,一样没有限制。不过,Visual C+本来就

10、是为MFC打造的,Visual C+中的许多特征和语言扩展也是为MFC而设计的,所以用Visual C+而不用MFC就等于抛弃了Visual C+中很大的一部分功能。但是,Visual C+也不等于MFC。(3)Platform SDK这才是Visual C+和整个Visual Studio的精华和灵魂,虽然我们很少能直接接触到它。大致说来,Platform SDK是以Microsoft C/C+编译器为核心(不是Visual C+,看清楚了),配合MASM,辅以其他一些工具和文档资料。上面说到Developer Studio没有编译程序的功能,那么这项工作是由谁来完成的呢?是CL,是NMAK

11、E,和其他许许多多命令行程序,这些我们看不到的程序才是构成Visual Studio的基石。6.2 编程/*哈夫曼编码*#include math.hstring.hstdio.hstdlib.hvector using namespace std;struct Huffman_InformationSource char InformationSign10; double Probability; char Code10; int CodeLength;;;struct HuffNode HuffNode *LeftSubtree,*middleSubtree,*RightSubtree,*

12、Next; int CodeLength;class CHuffman_2 public: CHuffman_2() ISNumber=0; AvageCodeLength=0.0; InformationRate=0.0; CodeEfficiency=0.0; Redundancy=0.0; CHuffman_2() DestroyBTree(HuffTree); void Huffman_Input(); void Huffman_Sort(); void Huffman_Tree(); void Huffman_Coding(); void Huffman_CodeAnalyzing(

13、); void Huffman_Display(); void DestroyBTree(HuffNode *TreePointer);private: vectorISarray; int ISNumber; double AvageCodeLength; double InformationRate; double CodeEfficiency; HuffNode * HuffTree;private: void Huffman_Code(HuffNode *TreePointer);/输入信源信息void CHuffman_2:Huffman_Input() Huffman_Inform

14、ationSource temp1=x1,0.40,0; ISarray.push_back(temp1); Huffman_InformationSource temp2=x2,0.18,0; ISarray.push_back(temp2); Huffman_InformationSource temp3=x3,0.10, ISarray.push_back(temp3); Huffman_InformationSource temp4=x4 ISarray.push_back(temp4); Huffman_InformationSource temp5=x5,0.07, ISarray

15、.push_back(temp5); Huffman_InformationSource temp6=x6,0.06, ISarray.push_back(temp6); Huffman_InformationSource temp7=x7,0.05, ISarray.push_back(temp7); Huffman_InformationSource temp8=x8,0.04, ISarray.push_back(temp8); ISNumber=ISarray.size();/按概率“从大到小”排序Huffman_Sort() Huffman_InformationSource tem

16、p; int I,j; for(i=0;iISNumber-1;i+) for(j=i+1;jISNumber;j+) if(ISarrayi.ProbabilityInformationSign,ISarray0.InformationSign); ptr1-Probability=ISarray0.Probability;Code,ISarray0.Code);LeftSubtree=NULL;middleSubtree =NULL;RightSubtree=NULL;Next=NULL; HuffTree=ptr1; for(i=1;i+) ptr2=new HuffNode; strc

17、py(ptr2-InformationSign,ISarrayi.InformationSign); ptr2-Probability=ISarrayi.Probability;Code,ISarrayi.Code);Next=ptr1; ptr1=ptr2; int k; int s; k=ceil(double)(ISNumber-3)/(3-1); s=3+k*(3-1)-ISNumber; if(s=1) ptr2=ptr1-Next; ptr4=new HuffNode; strcpy(ptr4-InformationSign,*); ptr4-Probability=ptr1-Pr

18、obability+ptr2-Probability;Code,LeftSubtree =NULL;middleSubtree=ptr1;ptr4-RightSubtree=ptr2; HuffTree=ptr2- temp1=HuffTree; while(temp1&(ptr4-Probabilitytemp1-Probability) temp2=temp1; temp1=temp1- Next=temp1; if(temp1=HuffTree) HuffTree=ptr4; else temp2-Next=ptr4; ptr1=HuffTree; while(ptr1-Next) /合

19、并概率最小的结点 ptr3=ptr2-Probability +ptr3-LeftSubtree=ptr1;middleSubtree=ptr2;RightSubtree=ptr3; HuffTree=ptr3- /释放: ptr1=NULL; ptr2=NULL; ptr3=NULL; ptr4=NULL; temp1=NULL; temp2=NULL; strcpy(HuffTree- HuffTree-CodeLength=0;/生成哈夫曼码Huffman_Code(HuffNode *TreePointer) if (TreePointer = NULL) return; char t

20、empstr10=; if(!TreePointer-LeftSubtree&!middleSubtree &RightSubtree) for(int i=0; if(strcmp(ISarrayi.InformationSign,TreePointer-InformationSign)=0) strcpy(ISarrayi.Code,TreePointer-Code); ISarrayi.CodeLength=TreePointer-CodeLength; return; if(TreePointer-LeftSubtree) strcpy(tempstr,TreePointer- strcat(tempstr,2 strcpy(TreePointer-LeftSubtree-Code,tempstr); TreePointer-CodeLength=TreePointer-CodeLength+1; Huffman_Code(TreePointer-LeftSubtree);middleSubtree)1middleSubtree-middleSubtree);0RightSubtree- Huffman_Code(TreePointer

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

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