1、信息论与编码实习报告信息论与编码实习报告 实验一 唯一可译码判决准则一、 实验内容编程实现唯一可译码的判决准则SardinasPatterson算法二、实验环境1. 计算机2. Windows 2000 或以上3. VC+ 6.0三、实验目的1. 进一步熟悉唯一可译码判决准则;2. 掌握VC开发环境的使用;3. 掌握C语言编程(尤其是字符串处理);四、实验要求1. 提前预习实验,认真阅读实验原理。2. 认真高效的完成实验,实验过程中服从实验室管理人员以及实验指导老师的管理。3. 认真填写实验报告。五、实验原理1. 唯一可译码判决准则的原理参考书1的153页。 其原理可简介如下: 将源码组C中所
2、有可能的尾随后缀组成一个集合F,当且仅当集合F中没有包含任一码字,便可判断此码C为唯一可译变长码。2. 算法流程输入码字集合X0for 所有Wi,WjX0if 码字Wi 是码字Wj 的前缀,即将相应的后缀作为一个尾随后缀放入新集合X1 end ifend forfor 所有WiX0for 所有Wj Xn1if Wi 是Wj 的前缀,即将相应的后缀作为一个尾随后缀放入新集合Xn中 else if Wj是Wi的前缀,即将相应的后缀作为一个尾随后缀放入新集合Xn中 end if end for end for 构造尾随后缀集合XXiif 有码字WiX0,WiX,则非唯一可译码6、实验设计 1、数据结
3、构 本实验所需设计的程序中,码字可用如下结构表示: char c10050 尾随后缀用如下结构表示: char f30050 2、关键算法 本程序的关键算法是用来求尾随后缀的SardinasPatterson算法。其算法流程图如下: Y N Y N Y N N Y void patterson(char c,char d) /检测尾随后缀 int i,j,k; for(i=0;i+) if(ci=0&di=0)/2字符串一样,跳出 break; if(ci=0) /d比c长,将d的尾随后缀放入f中 for(j=i;dj!=0;j+) fsumj-i=dj; fsumj-i=0; for(k=0
4、;ksum;k+) if(strcmp(fsum,fk)=0) /*查看当前生成的尾随后缀在f集合中是否存在*/ sum-;break; sum+; break; if(di=0) /c比d长,将c的尾随后缀放入f中 for(j=i;cj!=0;j+) fsumj-i=cj; fsumj-i=0; for(k=0;ksum;k+) if(strcmp(fsum,fk)=0) /*查看当前生成的尾随后缀在f集合中是否存在*/ sum-;break; sum+; break; if(ci!=di)/字符不一样了也退出 break; 3、函数调用关系图Main()函数调用void patterson
5、(char c,char d)函数。 8、用户手册及总结 用户手册: 1.按照提示先输入随后将输入字符串的总个数2.依次输入个字符串3.得出结果 总结: 本次编程实验中进一步加深了对尾随后缀集合算法的理解,运用C语言将其实现。在程序中设置了一个互相比较两个字符串是否为对方前缀的函数,以求得尾随后缀。 程序大体写完后,又在原程序的基础上增加了它的鲁棒性。附源代码:#include#includechar c10050;char f30050;int N,sum=0; /N为输入码字的个数,sum为尾随后缀集合中码字的个数int flag; /判断是否唯一可译标志位void patterson(c
6、har c,char d) /检测尾随后缀 int i,j,k; for(i=0;i+) if(ci=0&di=0)/2字符串一样,跳出 break; if(ci=0) /d比c长,将d的尾随后缀放入f中 for(j=i;dj!=0;j+) fsumj-i=dj; fsumj-i=0; for(k=0;ksum;k+) if(strcmp(fsum,fk)=0) /*查看当前生成的尾随后缀在f集合中是否存在*/ sum-;break; sum+; break; if(di=0) /c比d长,将c的尾随后缀放入f中 for(j=i;cj!=0;j+) fsumj-i=cj; fsumj-i=0;
7、 for(k=0;k100) printf(输入码字个数过大,请输入小于100的数n); printf(请输入码字的个数(小于100):); scanf(%d,&N); flag=0; printf(请分别输入码字(每个码字长度小于50个字符):n); for(i=0;iN;i+) scanf(%s,&ci); for(i=0;iN-1;i+)/判断如果码本身是否重复 for(j=i+1;jN;j+) if(strcmp(ci,cj)=0) flag=1;break; if(flag=1)/如果码本身有重复,就可以断定它不是唯一可译码 printf(这不是唯一可译码。n); else for(
8、i=0;iN-1;i+) /*此处是根据原始编码生成的尾随后缀集合s1放入f中*/ for(j=i+1;jN;j+) patterson(ci,cj); for(i=0;i+) /根据原始码与si生成si+1也放入fi int s=0; for(j=0;jN;j+) /*判断si+1中的字符串是否与si中一样 ,重复的则不再添加*/ if(i=sum) s=1;break; else patterson(fi,cj); if(s=1)break; for(i=0;isum;i+) /*判断p里的字符串是否与s 中重复,重复则不是唯一的*/ for(j=0;jN;j+) if(strcmp(fi
9、,cj)=0) flag=1; break; if(flag=1) printf(这不是唯一可译码。n); else printf(这是唯一可译码。n); printf(尾随后缀集合为:); for(i=0;i=sum;i+) printf(n%s,fi);实验二 Shannon编码一、 实验内容编程实现Shannon编码算法二、实验环境1. 计算机2. Windows 2000 或以上3. VC+ 6.0三、实验目的1. 进一步熟悉Shannon编码算法;2. 掌握C语言编程(尤其是数值的进制转换,数值与字符串之间的转换等)四、实验要求1. 提前预习实验,认真阅读实验原理。2. 认真高效的完
10、成实验,实验过程中服从实验室管理人员以及实验指导老师的管理。3. 认真填写实验报告。五、实验原理1. Shannon编码的原理参考书1的162页。2. 算法流程输入信源符号个数q,信源概率分布P降序排列pifor i=1 q 计算编码长度 ; 计算累加概率; 将累加概率F(si) (十进制小数)变成二进制数取小数点后li 位数作为第i个消息的码字。 end for六、参考书1. 信息论基础理论及应用傅祖芸,电子工业出版社七、实验设计 1、数据结构 本实验所需设计的程序中,码字可用如下结构表示: typedef struct symbol char s50; double pa,pb,h; /分
11、别为符号概率,累加概率,自信息量 int l; /码字长度 char m100; /码字symbol; 2、关键算法 本程序的关键算法是通过累加概率及码长求码字,其算法流程图如下: Y N N Yfor(i=0;iN;i+) /求码字 p=sbi.pb; for(j=0;j=1) sbi.mj=1; p=p-1; else sbi.mj=0; sbi.msbi.l=0; 3、函数调用关系图 仅有main()函数。概率排序、求累加概率、自信息量、码字长度、码字的函数均包含在main()函数内。9、用户手册及总结 用户手册: 1.按照提示先输入信源的总个数2.依次输入各信源的名称3.再按上序输入信
12、源的概率4.得出结果 总结: 本次编程中没有用到特别复杂的算法。按照香农编码的编码方法依次实现各模块即可。在编程中要注意的是数字的类型,利用log函数时求得的值是double型。附源代码:#include#include#includetypedef struct symbol char s50; double pa,pb,h; /分别为符号概率,累加概率,自信息量 int l; /码字长度 char m100; /码字symbol;int N;void main() int i,j; symbol sb100; printf(请输入符号的个数:); scanf(%d,&N); printf(
13、请依次输入消息符号:n); for(i=0;iN;i+) scanf(%s,sbi.s); printf(请依次输入各消息符号的概率:n); for(i=0;iN;i+) scanf(%lf,&sbi.pa); int x; symbol z; for(i=0;iN-1;i+) /按照符号概率由大到小排序 x=i; for(j=i+1;jN;j+) if(sbx.pasbj.pa) x=j; z=sbi;sbi=sbx;sbx=z; sb0.pb=0; for(i=1;iN;i+) /求累加概率 sbi.pb=sbi-1.pb+sbi-1.pa; double y; for(i=0;iN;i+
14、) /求自信息量,及码字长度 sbi.h=-log(sbi.pa)/log(2); y=sbi.h; if(sbi.h-(int)y=0) sbi.l=(int)y; else sbi.l=(int)(y+1); double p; for(i=0;iN;i+) /求码字 p=sbi.pb; for(j=0;j=1) sbi.mj=1; p=p-1; else sbi.mj=0; sbi.msbi.l=0; printf(消息符号 符号概率 累加概率 信息量 码字长度 码字n); for(i=0;iN;i+) /输出 printf(%-8s %1.4lf %1.4lf %1.4lf %3d %sn,sbi.s,sbi.pa,sbi.pb,sbi.h,sbi.l,sbi.m);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1