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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

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

1、0.40.180.1 0.10.070.060.050.04编码方法:先将信源符号按其出现的概率大小依次排列, 并取概率最小的字母分别配以 0 和 1 两个码元(先 0 后 1 或者先 1 后 0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。并不断重复这一过程,直到最后两个符号配以 0 和 1 为止。最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字。哈夫曼编码方式得到的码并非唯一的。在对信源缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减中的排序将会导致不同码字,但不同的排序将会影响码字的

2、长度,一般讲合并的概率放在上1面,这样可获得较小的码方差。四、设计原理4.1 哈夫曼编码步骤( 1)将信源消息符号按照其出现的概率大小依次排列为p1 p2 pn( 2)取两个概率最小的字母分别配以 0 和 1 两个码元,并将这两个概率相加作为一个新的概率,与未分配的二进制符号的字母重新排队。(3)对重新排列后的两个最小符号重复步骤( 2)的过程。(4)不断重复上述过程,知道最后两个符号配以 0 和 1 为止。(5)从最后一级开始,向前返回得到的各个信源符号所对应的码元序列,即为相应的码字。4.2 哈夫曼编码特点哈夫曼编码是用概率匹配的方法进行信源匹配方法进行信源。它的特点是:(1)哈夫曼的编码

3、方法保证了概率大的符号对应于短码,概率小的符号对应于长码,充分应用了短码。(2)缩减信源的最后两个码字总是最后一位不同,从而保证了哈夫曼编码是即时码。(3)哈夫曼编码所形成的码字不是唯一的,但编码效率是唯一的,在对最小的两个速率符号赋值时可以规定大的为“ 1”,小得为“ 0”,如果两个符号的出现概率相等时,排列时无论哪个在前都可以,所以哈夫曼所构造的码字不是唯一的,对于同一个信息源,无论上述的顺序如何排列,他的平均码长是不会改变的,所以编码效率是唯一的。(4)只有当信息源各符号出现的概率很不平均的时候,哈夫曼编码的效果才明显。(5)哈夫曼编码必须精确的统计出原始文件中每个符号出现频率,如果没有

4、这些精确的统计将达不到预期效果。哈夫曼编码通常要经过两遍操作,第一遍进行统计,第二遍产生编码,所以编码速度相对慢。另外实现电路复杂,各种长度的编码的编译过程也是比较复杂的,因此解压缩的过程也比较慢。2(6)哈夫曼编码只能用整数来表示单个符号,而不能用小数,这很大程度上限制了压缩效果。哈夫曼所有位都是合在一起的,如果改动其中一位就可以使其数据变得面目全非。五、设计步骤5.1 以框图形式画出哈夫曼编码过程(哈夫曼编码要求构建哈夫曼树)。表 1 哈夫曼编码信源概率编码过程编码X10.60 1.00.190.230.370 0.4X20.10.130 0.23X3X40.09X5X6X7X8哈夫曼树:

5、码码字长111311300004010040101 400010 500011 5给定 n 个实数 w1,w2,wn( n 2),求一个具有 n 个结点的二叉数,使其带权路径长度最小。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为 0 层,叶结点到根结点的路径长度为 叶 结 点 的 层 数 )。 树 的 带 权 路 径 长 度 为WPL=(W1*L1+W2*L2+W3*L3+.+Wn*Ln) ,N 个权值 Wi(i=1,2,.n)构成一棵有 N 个叶结点的二叉树, 相应的叶结点的路径长度为 Li(i=1,2,.n)。可以证明哈夫曼树的 WPL 是最小的。(

6、1)根据与 n 个权值 w1,w2 wn对应的 n 个结点构成具有 n 棵二叉树的森林 F=T1,T2 Tn,其中第 i 棵二叉树 Ti(1 i n)都只有一个权值为 wi 的3根结点,其左、右子树均为空。(2) 在森林 F 中选出两棵根结点的权值最小的树作为一棵新树的左、 右子树,且置新树的根结点的权值为其左、右子树上根结点权值之和。(3)从 F 中删除构成新树的那两棵,同时把新树加入 F 中。(4)重复第(2)和第( 3)步,直到 F 中只含有一棵为止, 此树便为 Huffman树。图 1 哈夫曼树5.2 计算平均码长、编码效率、冗余度。平均码长为:8K = p( xi )Ki =0.4

7、1+0.18 3+0.1 4+0.07 4+0.06 i 14+0.05 5+0.04 5=2.61 (码元 / 符号)信源熵为:nH ( X ) p(xi ) log p(xi ) -(0.4log0.4+0.18log0.18+0.1log0.1+0.1log0.1+0.07+log0.07+0.06log0.06+0.05log0.05+0.04log0.04)4=2.55bit/ 符号信息传输速率为:R= H ( X ) = 2.55 =0.977bit/码元K 2.61编码效率为:=H ( X ) = 2.55 =0.977K2.61冗余度为:=1- =1-0.977=0.023六、

8、哈夫曼编码的实现6.1 软件介绍Visual C+ 6.0,简称 VC 或者 VC6.0 ,是微软推出的一款 C+ 编译器,将 “高级语言 ”翻译为 “机器语言(低级语言) ”的程序。 Visual C+是一个功能强大的可视化软件开发工具。自 1993 年 Microsoft 公司推出 Visual C+1.0 后,随着其新版本的不断问世, Visual C+ 已成为专业程序员进行软件开发的首选工具。Visual C+6.0 由 Microsoft 开发 , 它不仅是一个 C+ 编译器,而且是一个基于 Windows 操 作 系 统 的 可 视 化 集 成 开 发 环 境 ( integrat

9、ed development environment,IDE )。Visual C+6.0 由许多组件组成,包括编辑器、调试器以及程序向导 AppWizard 、类向导 Class Wizard 等开发工具。 这些组件通过一个名为 Developer Studio的组件集成为和谐的开发环境。 Microsoft 的主力软件产品。Visual C+是一个功能强大的可视化软件开发工具。Visual C+6.0 以拥有 “语法高亮 ”,自动编译功能以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及创建预

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

11、o并不是专门用于 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 ,一样没有限制。不过, Visu

12、al C+ 本来就是为 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

13、没有编译程序的功能, 那么这项工作是由谁来完成的呢?是 CL ,是 NMAKE ,和其他许许多多命令行程序,这些我们看不到的程序才是构成 Visual Studio的基石。6.2 编程/* 哈夫曼编码 *#include math.hstring.hstdio.hstdlib.hvectorusing namespace std;6struct Huffman_InformationSourcechar InformationSign10;double Probability;char Code10;int CodeLength;;;struct HuffNodeHuffNode *LeftS

14、ubtree,*middleSubtree,*RightSubtree,*Next;int CodeLength;class CHuffman_2public:CHuffman_2()ISNumber=0;AvageCodeLength=0.0;InformationRate=0.0;CodeEfficiency=0.0;Redundancy=0.0;DestroyBTree(HuffTree);7void Huffman_Input() ;void Huffman_Sort();void Huffman_Tree();void Huffman_Coding();void Huffman_Co

15、deAnalyzing();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_In

16、formationSource 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=x4ISarray.push_back(temp4);Huffman_InformationSource temp5=x5,0.07,ISarray.pus

17、h_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 temp;int I,j;

18、for(i=0;iISNumber-1;i+)for(j=i+1;jISNumber;j+)if(ISarrayi.ProbabilityInformationSign,ISarray0.InformationSign);ptr1-Probability=ISarray0.Probability;9Code,ISarray0.Code);LeftSubtree=NULL;middleSubtree =NULL;RightSubtree=NULL;Next=NULL;HuffTree=ptr1;for(i=1;ptr2=new HuffNode;strcpy(ptr2-InformationSi

19、gn,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-Probability+ptr2-Probability;Code,

20、10LeftSubtree =NULL;middleSubtree=ptr1;RightSubtree=ptr2;HuffTree=ptr2-temp1=HuffTree;while(temp1&(ptr4-Probabilitytemp1-Probability)temp2=temp1;temp1=temp1-Next=temp1;if(temp1=HuffTree)HuffTree=ptr4;elsetemp2-Next=ptr4;ptr1=HuffTree;while(ptr1-Next)/合并概率最小的结点ptr3=ptr2-Probability +ptr3-LeftSubtree=

21、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 tempstr10=;12if(!TreePointer-LeftSubtree&!middleSubtree &RightS

22、ubtree)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,2strcpy(TreePointer-LeftSubtree-Code,tempstr);CodeLength=TreePointer-CodeL

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2