当前位置:文档之家› 哈夫曼编码信息论课程设计

哈夫曼编码信息论课程设计

信息论课程设计实验报告专业班级:信计0802姓名:刘建勋学号:07目录:1.课题描述-----------------------------------------------------------------------------------------32.信源编码的相关介绍---------------------------------------------------------------------33.哈夫曼编码-------------------------------------------------------------------------------------3哈夫曼编码算法-----------------------------------------------------------------------3哈弗曼编码的特点--------------------------------------------------------------------4哈夫曼实验原理----------------------------------------------------------------------- 4 4.哈夫曼编码的C++实现-----------------------------------------------------------------5程序设计-----------------------------------------------------------------------------------5运行结果-----------------------------------------------------------------------------------8 总结-----------------------------------------------------------------------------------------------------8 参考文献-------------------------------------------------------------------------------------------------81.课题描述实验类别:设计性实验实验目的:掌握哈夫曼编码原理;了解哈夫曼码的最佳性;实验内容:编程实现二元huffman编码;2.信源编码的相关介绍:信源编码的基础是信息论中的两个编码定理:无失真编码定理和限失真编码定理,前者是可逆编码定理的基础。

可逆是指当信源符号转换成代码后,可从代码无失真的恢复信源符号。

当已知信源符号的概率特性时,可计算它的符号熵,这表示每个信源符号所载的信息量。

编码定理不仅证明了必定存在一种编码方法,可是代码的平均长度可任意接近但不低于符号熵,而且还阐明达到这目标的途径,这就是使概率和码长相匹配。

无失真编码和可逆编码只适用于离散信源。

对于连续信源,编程代码后就无法无失真的恢复原来的连续值,因为后者的取值可有无限多个。

此时只能根据率失真编码定理在失真受限制的情况下进行限失真编码。

信源编码定理出现以后,编码方法就趋于合理化。

3.哈夫曼编码:哈夫曼编码算法:递归算法void HFMCoding(Tree &HFMnode, HFMCode, int *m2, int n) {int i, j, m1, m2 ,x1, x2, Init;char *cd;unsigned int c, f;if (n<=1) return;m1 = 2 * n - 1;HFMnode = (Tree)malloc((m+1) * sizeof(HTNode));for (i=1; i<=n; i++) { robability=m2[i-1];HFMnode [i].parent=0;HFMnode [i].lchild=0;HFMnode [i].rchild=0;}for (i=n+1; i<=m; i++) { robability=0;HFMnode [i].parent=-1;HFMnode [i].lchild=-1;HFMnode [i].rchild=-1; }printf("\n哈夫曼树的构造过程如下所示:\n");printf("HT初态:\n 结点 probability parent lchild rchild");for (i=1; i<=m; i++)printf("\n%f%f%f%f%f",i,HT[i]. probabilityHFMnode [i].parent, HFMnode[i].lchild, HFMnode [i].rchild);getch();for (i=n+1; i<=m; i++) { arent = i; HFMnode [x2].parent = i;HFMnode [i].lchild = x1; HFMnode [i].rchild = x2;HFMnode [i]. probability = HFMnode [x1]. probability+ HFMnode [x2]. probability; printf("\nselect: x1=%f x2=%f\n", x1, x2);printf(" 结点 probability parent lchild rchild");for (j=1; j<=i; j++)printf("\n%f%f%f%f%f",j,HT[j]. probability t,HT[j].parent,HT[j].lchild, HT[j].rchild);}cd = (char *)malloc(n*sizeof(char)); arent; f!=0; c=f, f=probability [f].parent)child==c) cd[--Init] = '0';else cd[--Init] = '1';HFMCode [i] = (char *)malloc((n- Init)*sizeof(char));1码1码1码夫曼编码的c++实现程序设计:#include <iostream>#include<>using namespace std;#define leafnode 10 robability=0;HFMnode[i].parent=-1;HFMnode[i].lchild=-1;HFMnode[i].rchild=-1;}for(i=0;i<n;i++){cout<<"a["<<i<<"]的概率=";cin>>HFMnode[i].probability;float Ia,Hp;Ia=-log10(a[i])/log10(2);Hp=a[i]*Ia;}for(i=0;i<n-1;i++){m1=m2=maxvalue;x1=x2=0;for(j=0;j<n+i;j++){if(HFMnode[j].probability<m1&&HFMnode[j].parent==-1){m2=m1;x2=x1;m1=HFMnode[j].probability;x1=j;}else if(HFMnode[j].probability<m2&&HFMnode[j].parent==-1){m2=HFMnode[j].probability;x2=j;}}HFMnode[x1].parent=n+i;HFMnode[x2].parent=n+i;HFMnode[n+i].probability=HFMnode[x1].probability+HFMnode[x2].probability; HFMnode[n+i].lchild=x1;HFMnode[n+i].rchild=x2;}}void main(){cout<<"*****************************************"<<endl;cout<<"编写者:刘建勋"<<endl;cout<<"题目:编程实现二元huffman编码"<<endl;cout<<"*****************************************"<<endl;float Hp,k=0,y;HFMnodetype HFMnode[node];HFMcodetype HFMcode[leafnode],cd;int i,j,c,p,m,mz;cout<<"信源的符号数:\n";cout<<"m=";cin>>m;tree(HFMnode,m);for(i=0;i<m;i++){=m-1;c=i;p=HFMnode[c].parent;while(p!=-1){if(HFMnode[p].lchild==c) []=0;else []=1;;c=p;p=HFMnode[c].parent;}for(j=+1;j<m;j++)HFMcode[i].type[j]=[j];HFMcode[i].Init=;}for(i=0;i<m;i++){cout<<"a["<<i<<"]=的码符号序列为:"; for(j=HFMcode[i].Init+1;j<m;j++) cout<<HFMcode[i].type[j];cout<<"\n";ype[j]);k=k+a[i]*mz;}y=Hp/k;cout<<"编码效率\ny="<<y<<endl;} HFMcode[i].type[j]=[j];HFMcode[i].Init=;}for(i=0;i<m;i++){cout<<"a["<<i<<"]=的码符号序列为:"; for(j=HFMcode[i].Init+1;j<m;j++) cout<<HFMcode[i].type[j];cout<<"\n";ype[j]);k=k+a[i]*mz;}y=Hp/k;cout<<"编码效率\ny="<<y<<endl;}运行结果:总结:哈夫曼的具体实现,在信息论及其相关相关课程做相应的实验,所以无论在理解上或是实现上,都不是很困难,程序上实现哈夫曼的编码与译码,由于哈夫曼自身的特点,编码与译码均不是唯一,但是相同的编译码规则还是能实现正确的译码的。

相关主题