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-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1