霍夫曼编码的C语言实现.doc_第1页
霍夫曼编码的C语言实现.doc_第2页
霍夫曼编码的C语言实现.doc_第3页
霍夫曼编码的C语言实现.doc_第4页
霍夫曼编码的C语言实现.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

霍夫曼编码的C语言实现1.霍夫曼编码霍夫曼编码是1952年为文本文件而建立,是一种统计编码。属于无损压缩编码。霍夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短;而对于出现频率低的信息,编码长度较长。这样,处理全部信息的总码长一定小于实际信息的符号长度。霍夫曼编码同香农、费诺编码一样是一种通信编码,但是他们是按不同思路设计了各自的编码实现方法。通信的根本问题是如何将信源输出的信息在接收端的信息精确或近似的复制出来。若接收端要求无失真地精确复制信源输出的消息,此信源编是无失真编码。只有对离散信源可以实现无失真编码,由于连续信源输出信息量可为无限大,故不可能实现无失真编码。霍夫曼编码就是一种无损压缩编码,在通信领域中应用非常广泛,因此我们用C语言的方式为让大家更好的认识和理解霍夫曼编码。2.编码原理霍夫曼码由霍夫曼树构造,平均码长是霍夫曼树的带权路径长度,由于霍夫曼树是权最小的树,故其压缩效果最好。霍夫曼树即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。在计算机信息处理中,“霍夫曼编码”是一种一致性编码法(又称熵编码法),用于数据的无损耗压缩。这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的。霍夫曼码是用概率匹配方法进行信源编码。有两个明显特点:一是保证了概率大的符号对应于短码,概率小的对应于长码,充分利用了短码;二是缩减信源的最后二个码字总是最后一位不同,从而保证了霍夫曼码是即时码。霍夫曼变长码的效率很高,它可以单个信源符号编码或用L较小的信源序列编码,对编码器的设计来说也易实现,但要注意,更高效率的编码仍须按长序列来计算,这样才能使平均码字降低。3.霍夫曼编码的步骤(l)将信号源的符号按照出现概率递减的顺序排列。(2)将两个最小出现概率进行合并相加,得到的结果作为新符号的出现概率。(3)重复进行步骤1和2直到概率相加的结果等于1为止。(4)在合并运算时,概率大的符号用编码0表示,概率小的符号用编码1表示。(5)记录下概率为1处到当前信号源符号之间的0,l序列,从而得到每个符号的编码。例如:设信号源为ss1, s2, s3, s4, s5对应的概率为p0.25,0.22,0.20, 0.18,0.15。根据字符出现的概率来构造平均长度最短的异字头码字。霍未曼编码通常采用两次扫描的办法,第一次扫描得到统计结果,第二次扫描进行编码。4.编码的特点(1)哈夫曼编码实际上构造了一个码树,码树从最上层的端点开始构造,直到树根结束,最后得到一个横放的码树,因此,编出的码是即时码。(2)哈夫曼编码采用概率匹配方法来决定各码字的码长,概率大的符号对应于短码,概率小的符号对应于长码,从而使平均码长最小。(3)每次对概率最小的两个符号求概率之和形成缩减信源时,就构造出两个树枝,由于给两个树枝赋码元时是任意的,因此编出的码字并不惟一。5.C语言的实现#include #include #include #include #include #define HuffmanTree HF#define HuffmanCode HMCtypedef structunsigned int weight;unsigned int parent,lchild,rchild; HTNode,*HF;typedef char *HMC;typedef struct unsigned int s1;unsigned int s2; MinCode;void Error(char *message);HMC HuffmanCoding(HF HT,HMC HC,unsigned int *w,unsigned int n);MinCode Select(HF HT,unsigned int n);void Error(char *message)fprintf(stderr,Error:%s/n,message);exit(1);HMC HuffmanCoding(HF HT,HMC HC,unsigned int *w,unsigned int n)unsigned int i,s1=0,s2=0;HF p;char *cd;unsigned int f,c,start,m;MinCode min;if(n=1) Error(Code too small!);m=2*n-1;HT=(HF)malloc(m+1)*sizeof(HTNode);for(p=HT,i=0;iweight=*w;p-parent=0;p-lchild=0;p-rchild=0;for(;iweight=0;p-parent=0;p-lchild=0;p-rchild=0;for(i=n+1;i=m;i+)min=Select(HT,i-1);s1=min.s1;s2=min.s2;HTs1.parent=i;HTs2.parent=i;HTi.lchild=s1;HTi.rchild=s2;HTi.weight=HTs1.weight+HTs2.weight;printf(HT List:/n);printf(Number/t/tweight/t/tparent/t/tlchild/t/trchild/n);for(i=1;i=m;i+)printf(%d/t/t%d/t/t%d/t/t%d/t/t%d/n,i,HTi.weight,HTi.parent,HTi.lchild,HTi.rchild);HC=(HMC)malloc(n+1)*sizeof(char *);cd=(char *)malloc(n*sizeof(char *);cdn-1=/0;for(i=1;i=n;i+)start=n-1;for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent)if(HTf.lchild=c) cd-start=0;else cd-start=1;HCi=(char *)malloc(n-start)*sizeof(char *);strcpy(HCi,&cdstart);free(cd);return HC;void main()MinCode Select(HF HT,unsigned int n);HF HT=NULL;HuffmanCode HC=NULL;unsigned int *w=NULL;unsigned int i,n;printf(请输入节点数n:);scanf(%d,&n);w=(unsigned int *)malloc(n+1)*sizeof(unsigned int *);w0=0;printf(请输入权重:/n);for(i=1;i=n;i+)printf(w%d=,i);scanf(%d,&wi);HC=HuffmanCoding(HT,HC,w,n);printf(HMC:/n);printf(Number/t/tWeight/t/tCode/n);for(i=1;i=n;i+)printf(%d/t/t%d/t/t%s/n,i,wi,HCi);MinCode Select(HF HT,unsigned int n)unsigned int min,secmin;unsigned int temp;unsigned int i,s1,s2,tempi;MinCode code;s1=1;s2=1;for(i=1;i=n;i+)if(HTi.parent=0)min=HTi.weight;s1=i;break;tempi=i+;for(;i=n;i+)if(HTi.weightmin&HTi.parent=0)min=HTi.weight;s1=i;for(i=tempi;i=n;i+)if(HTi.parent=0&i!=s1)secmin=HTi.weight;s2=i;break;for(i=1;i=n;i+)if(HTi.weights2)temp=s1;s1=s2;s2=temp;code.s1=s1;code.s2=s2;return code;执行程序后显示如图1:图1改变节点数n的值后显示如图2:图26.霍夫曼编码的优、缺点:优点:(1)有效的信源编码可取得较好的冗余压缩效果。(2)有效的信源编码可使输出码元概率均匀化。在哈夫曼编码过程中,对缩减信源符号按概率由大到小的顺序重新排列时,应使合并后的新符号尽可能排在靠前的位置,这样可使合并后的新符号重复编码次数减少,使短码得到充分利用。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论