1、信息论题 目:信息论上机实习报告姓 名:刘彬班 级:123102学 号:20101000234指导老师:余林琛2012年11月21日香农码一、 算法设计1.将信源发出的信号按概率从小到大排列。2.计算累加概率。3.以2为底求对数定码长。4.将概率变为二进制。二、 程序#include #include #define N 7void main()struct Shannon char XYFH10; double XYGL; double LJGL; int Length; int a20;shanN;int i,j;double m,n;struct Shannon X;printf(请输入
2、信源符号:n);for(i=0;iN;i+) scanf(%s,shani.XYFH);printf(请输入信源概率:n);for(i=0;iN;i+) scanf(%lf,&shani.XYGL);for(j=0;jN;j+) for(i=0;iN-j;i+) /*冒泡排序*/ if(shani.XYGLshani+1.XYGL) X=shani; shani=shani+1; shani+1=X; for(i=1,shan0.LJGL=0;iN;i+) /*计算累加概率*/ shani.LJGL=shani-1.LJGL+shani-1.XYGL;for(i=0;iN;i+) /*转换二进
3、制*/ for(j=0,m=shani.LJGL;j1) shani.aj=1; m=m-1; else shani.aj=0; for(i=0;iN;i+) /*计算长度*/ n=(double) (-1)*log(shani.XYGL)/log(double) 2);shani.Length=1+(int)n;printf(输出结果为:n);for(i=0;iN;i+) printf(%s %lf %lf %d ,shani.XYFH,shani.XYGL,shani.LJGL,shani.Length); for(j=0;jshani.Length;j+) printf(%d,shani
4、.aj); printf(n); 三、运行结果二、费诺码一、 算法设计1、将信源发出的N个符号按其概率的递减输入。2、将依次排列的信源符号依概率分成两组,使两个组的概率和近于相同,并对各组赋予二进制代码符号“0”和“1”。3、通过各信源概率与该分组中的总概率的一般就能性比较,选取与总概率相差最小的进行分组。4、如此重复,直至每组值只剩下一个信源符号为止二、 程序三、运行结果三、唯一可译码一、算法描述1、考查C中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀放入集合F0中;2、考查C和Fi两个集合,若WjC是WiFi的前缀WiFi 是WjC的前缀,则将相应的后缀作为尾随后缀码放入
5、集合Fi+1中;3、 F=Fi即为码C的尾随后缀集合;4、若F中出现了C中的元素,则算法终止,返回假(C不是唯一译码);否则若F中没有出现新的元素,则返回真。程序#include #include char C1010,F2020;int M,N2,N3;void X(int N1)int i,j,k,m,L1,L2,L3,flag=0;char a10;N2=N1;for(i=0;iN1;i+) for(j=0;jM;j+) if(strcmp(Fi,Cj)=0)/判断F,C集合有没有重复元素 printf(不是唯一可译码:n); if(strcmp(Fi,Cj)0)/判断F是不是C的前缀
6、L1=strlen(Fi); L2=strlen(Cj); for(k=0;kL1;k+) if(Fik!=Cjk) break; if(k=L1) L3=L2-L1; for(m=0;mL3;k+,m+)/将后缀给a数组 am=Cjk; for(m=m+1;m10;m+) am=0; for(m=0;mN1;m+) if(strcmp(Fm,a)=0) flag=1; break; else flag=0; if(flag!=1)/将后缀加入到F集合 strcpy(FN2,a); N2+; if(N2=N1) printf(是唯一可译码n); return;N3=N2;for(i=0;iM;
7、i+) for(j=0;jN2;j+) if(strcmp(Ci,Fj)=0)/判断F,C集合有没有重复元素 printf(不是唯一可译码n); if(strcmp(Ci,Fj)0)/判断F是不是C的前缀 L1=strlen(Ci); L2=strlen(Fj); for(k=0;kL1;k+) if(Cik!=Fjk) break; if(k=L1)/将后缀给a数组 L3=L2-L1; for(m=0;mL3;k+,m+)/将后缀给a数组 am=Cjk; for(m=m+1;m10;m+) am=0; for(m=0;mN2;m+) if(strcmp(Fm,a)=0) flag=1; el
8、se flag=0; if(flag!=1) /将后缀加入到F集合 strcpy(FN3,a); N3+; if(N3=N2) printf(是唯一可译码n); return;else X(N3);void main()int i,j,m,k,L1,L2,L3,N=0,flag1=0;char a10;printf(请输入信源的个数:);scanf(%d,&M);printf(请输入信源符号:);for(i=0;iM;i+) scanf(%s,Ci);for(i=0;iM;i+) for(j=i+1;jM;j+) if(strcmp(Ci,Cj)0) L1=strlen(Ci); L2=strlen(Cj); for(k=0;kL1;k+) if(Cik!=Cjk) break; if(k=L1) L3=L2-L1; for(m=0;mL3;k+,m+) am=Cjk; am=0; for(m=0;mN;m+) if(strcmp(Fm,a)=0) flag1=1; if(flag1!=1) strcpy(FN,a); N+; X(N);运行结果
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1