信息论上机报告.doc_第1页
信息论上机报告.doc_第2页
信息论上机报告.doc_第3页
信息论上机报告.doc_第4页
信息论上机报告.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

目 录一、实习一:设计程序判断唯一可译码21、题目分析2 1.1、问题描述21.2、基本要求22、算法分析2 2.1、数据结构2 2.2、算法基本原理2 2.3、算法构造步骤2 2.4、简要流程图3 2.5、算法设计与实现33、测试结果44、分析与探讨4 4.1、遇到的问题及解决方法4 4.2、其他实现方法45、源代码 4二、实习二:香农编码81、题目分析8 1.1、问题描述81.2、实验目的82、算法分析8 2.1、数据结构8 2.2、算法基本原理8 2.3、主要函数设计及分析8 2.4、简要流程图93、测试结果94、分析与探讨105、源代码10三、实习三:费诺编码131、题目分析13 1.1、问题描述131.2、实验目的132、算法分析13 2.1、数据结构13 2.2、算法基本原理13 2.3、主要函数设计及分析13 2.4、简要流程图143、测试结果144、分析与探讨155、源代码15实习一:设计程序判断唯一可译码一、题目分析1.1问题描述设计一个程序实现判断输入码组是否为可译码组这一功能。1.2基本要求:(1)用适当的数据结构存放输入的码组;(2)利用A.A.Sardinas和G.W.Patterson提出的算法思想实现该功能;(3)输出判断结果。二、算法分析2.1、数据结构根据问题可知,需要用一个数据结构来存储输入的码组,我选择了一个如下结构体Code来存放输入码组的码字及每个码字的长度,再用数组来存放对应的码字。typedef structint dataM;int len;Code;2.2、算法基本原理如上图所示,可知当且仅当某个有限长的码符号序列能译成两种不同的码字序列时,此码不是唯一可译码。此时B1一定是A1的前缀,而A1的尾随后缀一定是另一码字B2的前缀;而B2的尾随后缀又是其他码字的前缀。最后,码符号序列的尾部一定是一个码字。将输入的码字存放在c数组中,将c中所有的尾随后缀组成一个集合f,当且仅当集合f中没有包含任一码字,便可判断c为唯一可译码。2.3、算法构造步骤(1)考查c中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀放入集合F0中;(2)考查C和Fi两个集合,若WjC是WiFi的前缀或WiFi 是WjC的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中;(3)F=Fi即为码C的尾随后缀集合;(4)若F中出现了C中的元素,则算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。2.4、简要流程图2.5算法设计与实现本程序用一个结构体来存放输入的码组的信息,其中dataM存放码字的各个位,len表示码字的长度,也就是M的值,即len=M。首先存入输入的码字,并计算克拉夫特不等式的值,若值大于1则直接输出“此码组不是唯一可译码组!”,反之则进行下一步计算。在这里,比较难处理的是码字的截断问题,我的实现方法如下:1)比较c中两个码字的长度和首个数字;2)若前一个码字的长度小于后一个码字的长度且首个数字相同,则用count计数记下相同位数的长度;3)将后一个码字的count位至最后一个截断,存放进f数组中。三、测试结果3.1、测试数据为0、10、1100、1110、1011、11013.2、测试数据为1、01、011、00013.3、测试数据为1、01、001、0001四、分析与探讨4.1、遇到的问题及解决方法在设计本程序的过程中遇到的最大的问题是尾随后缀的截断问题,刚开始时不知道以数字的形式实现如何截断尾随后缀,最后在自己的思考及实验下,采用计数器计数的方式来实现这个问题,使得这个问题得以较好的解决。4.2、其他实现方法还有一种比较普遍的实现方法就是用字符串来存储输入的码字和相关信息,通过调用不同的字符串操作函数来实现这个功能。五、源代码#include#include#include#define M 10#define N 1000typedef structint dataM;int len;Code;main()int i,n,b,j,k,count=0,flag=0,flag1=1;double sum=0;char aM;Code cN,fN;printf(请输入码字个数:);scanf(%d,&n);getchar();printf(请依次输入每个码字:n);for(i=0;in;i+)gets(a);b=strlen(a);for(j=0;j1) printf(此码组不是唯一可译码组!nn);elsefor(i=0;in-1;i+)for(j=1;j=cj.len|ci.data0!=cj.data0) continue;b=ci.len;while(b-)if(ci.datab=cj.datab) flag=1;elseflag=0;break;b=cj.len-ci.len;while(flag-)for(k=0;kb;k+) fcount.datak=cj.datab+k;fcount.len=b;count+=1;for(i=0;in;i+)for(j=0;jfj.len)b=fj.len;while(b-)if(ci.datab=fj.datab) flag=1;elseflag=0;break; b=ci.len-fj.len; while(flag-) for(k=0;kb;k+) fcount.datak=ci.datab+k; fcount.len=b; count+=1;elseb=ci.len;while(b-)if(ci.datab=fj.datab) flag=1;elseflag=0;break; b=fj.len-ci.len; while(flag-) for(k=0;kb;k+) fcount.datak=fj.datab+k; fcount.len=b; count+=1;for(i=0;in;i+)for(j=0;jcount;j+)if(ci.len=fj.len)for(k=0;kci.len;k+)if(ci.datak=fj.datak) flag1=0;break;else flag1=1;if(flag1=0) break;if(flag1=0) break;if(flag1=0) printf(此码组不是唯一可译码组!nn);else printf(此码组是唯一可译码组!nn);memset(c,0,sizeof(c);memset(f,0,sizeof(f);main();实习二:香农编码一、 题目分析1.1、问题描述对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。1.2、实验目的掌握通过计算机实现香农编码。二 、算法分析 2.1、数据结构分别用数组p、q、k存放输入的概率,累加概率、码字长度;2.2、算法基本原理给定某个信源符号的概率分布,通过以下的步骤进行香农编码:1)信源符号按概率从大到小排列;2)对信源符号求累加和,表达式: Pi=Pi-1+p(xi);3)求自信息量,确定码字长度。自信息量I(xi)=-log(p(xi);码字长度取大于等于自信息量的最小整数;4)将累加和用二进制表示,并取小数点后码字的长度的码 。2.3、主要函数设计及分析1)main()函数这个函数主要包含以下几个功能:实现用户的输入和编码结果的输出;判断用户输入是否合法;调用冒泡排序法对输入的概率进行排序;计算累加概率;计算每个符号对应码字的码长;调用编码函数;最用调用main()函数实现用户的循环输入。在这里值得详细介绍的一段代码如下:for(i=0;i=b)j+;a-=b;if(a=0) ki=j;else ki=j+1;本段代码的功能是求每个符号概率对应码字的长度,由于在直接对概率求取以2为底的对数时不易判断出结果是否为整数,也就不易向上取整。本段代码的思想是:利用模拟手工除法进行计算,用概率的对数减去log2,判断结果是否大于log2,如果大于则继续做减法运算;如果等于0则停止计算;如果大于0且小于log2则计数器j加1即为向上取整的值,可以有效的克服判断结果是否需要加1这一困难。2)array()函数本函数的功能主要是利用冒泡排序法对用户输入的各个符号对应的概率进行降序排列,以便于计算累加概率和编码。3)change()函数本函数的功能主要是将累加概率转换为二进制,从而根据码长计算出相应的码字,在这里用到对浮点数转换为二进制的算法。2.4、简要流程图三、测试结果3.1、测试数据为:0.20 0.19 0.17 0.15 0.10 0.01 0.183.2、测试数据为:0.32 0.22 0.18 0.16 0.08 0.043.3、上述两组测试数据的结果四、分析与探讨本程序实现上较为简单,在编程的过程中并没有遇到特别大的问题,只是在对概率取对数并向上取整时遇到一定的困难,经过思考,利用上述的模拟手工出发圆满的解决了这一难题,使得程序能够得以完成。五、源代码#include#include #include#define N 100int kN;void array(double *a,int n)int i,j,flag=1;double temp;for(i=0;in&flag=1;i+)flag=0;for(j=0;jn-i;j+)if(aj=1)bt=1;p-=1;p*=2;elsebt=0;p*=2;for(t=0;tkq;t+) printf(%d,bt);printf(n);void main()int i,j,n;double pN,qN,s=0,sum,a,b;printf(请输入符号个数:);scanf(%d,&n);printf(请依次输入每个符号的概率:n);for(i=0;in;i+) scanf(%lf,&pi);s=s+pi;if(pi=1) break;if(s=1)array(p,n);sum=0;for(i=0;in;i+) qi=sum;sum=sum+pi;for(i=0;i=b)j+;a-=b;if(a=0) ki=j;else ki=j+1;printf(按概率降序码字依次为:n); for(i=0;in;i+) printf(该码字对应累加概率为:%.3lft该码字码长为:%dtt码字为:,qi,ki);change(qi,i);printf(n);main();实习三、费诺编码一、 题目分析1.1、问题描述对于给定的信源的概率分布,按照费诺编码的方法进行计算机实现。1.2、实习目的掌握通过计算机实现费诺编码。二、算法分析2.1、数据结构本程序采用一个结构体的数据类型来存储费诺编码的相关信息,具体的数据结构如下:typedef struct char data; float P;FanoMAX+1;/需要编码的结构体2.2、算法基本原理1)将概率按从大到小的顺序排列;2)按编码进制数将概率分组,使每组概率和尽可能接近或相等;3)给每组分配一位码元;4)将每一分组再按同样原则划分,重复2)和3),直到概率不再可分为止。2.3、函数详细设计及分析1)main()函数本函数实现的主要功能有:实现需要编码符号相关信息的输入;判断用户输入是否正确;调用冒泡排序法函数BubbleSort(fano,n)对输入的概率进行降序排序;调用费诺编码函数FanoCode(1,n,fano);对排序后的概率进行编码并输出编码结果。2)BubbleSort()函数本函数是根据数据结构书上的冒泡排序法改编而来,实现对输入的概率进行降序排序以便于费诺编码。3)FanoCode()函数本函数的主要功能是实现编码过程的2)和3)。因为本函数是一个递归函数,所以在本函数中,首先用一个标志flag来判断需要编码的长度是否为输入的长度。如果已经编码的符号个数为输入的符号个数,则编码结束返回主函数。将排序后的概率分为两组最接近的数,然后将单个概率较大的一组编码为0,另一组编码为1。对分组后的两个小组递归调用FanoCode()函数,直到找到程序的出口,即编码完成。分组代码如下:for(j=1;ji+1;j+) aj=fanoj.P; for(j=m;j=n;j+) sum=sum+aj;k=m; while(s=sum-s) s1=s;s=s+fanok+.P;if(sum-2*s1)=(2*s-sum) k-;2.4、简要流程图三、测试结果3.1、测试数据为:a 0.20b 0.19c 0.17d 0.15e 0.10f 0.01g 0.18 运行结果为:3.2、测试数据为:a 0.32b 0.22c 0.18d 0.16e 0.08f 0.04运行结果为:四、分析与探讨在本次编码的过程中并没有遇到什么较大的问题,就是在验收程序的时候,老师说费诺编码应该是概率小的符号码字长度一定大于概率大的符号的码字长度,我回来思考并完成作业之后发现并不是那样的,符号码字的长度和概率的大小没有绝对的关系,只能说一般情况下,概率小的符号码字长度大于概率大的符号的码字长度。五、源代码#include#include#include#define MAX 20char p2020;typedef struct char data; float P;FanoMAX+1;/需要编码的结构体 void BubbleSort(Fano fano,int n)/用冒泡排序法对输入的概率进行排序 int i,j,flag=1;float temp;char temp1;for(i=2;in+1&flag=1;i+)flag=0;for(j=1;j=n+1-i;j+) if(fanoj.P=fanoj+1.P) flag=1; temp=fanoj+1.P; fanoj+1.P=fanoj.P; fanoj.P=temp; temp1=fanoj+1.data; fanoj+1.data=fanoj.data; fanoj.data=temp1;void FanoCode(int m,int n,Fano fano)/费诺编码int j,k,i,flag=0; float sum=0.0,s

温馨提示

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

评论

0/150

提交评论