信息论数学编码报告
信息论与编码实验报告 学院:计算机与通信工程学院 专业:计算机科学与技术 班级:计1203班 学号: 姓名: XX年12月29日 实验一唯一可译码判别准则 实验目的: 1.进一步熟悉唯一可译码判别准则; 2.掌握C语言字符串处理程序的设计和调试技术。 实验内容: 1.已知:信源符号数和码字集合C; 2.输入:任意的一个码,码字的个数和每个具体的码字在运行时从键盘输入; 3.输出:判决;循环。 实验原理: 根据唯一可译码的判别方法,利用数据结构所学的知识,定义字符串数据类型并利用指针进行编程来实现算法。 算法:1、考察C中所有的码字,若Wi是Wj的前缀,则将对应的后缀作为一个尾随后缀码放入集合Fi+1中; 2、考察C和Fi俩个集合,若Wi∈C是Wj∈F的前缀或Wi∈F是Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中; 3、F=∪Fi即为码C的尾随后缀集合; 4、若F中出现了C中的元素,算法终止,返回假;否则若F中没有出现新的元素,则返回真。 实验环境及实验文件存档名: 1.实验环境:visualC++ 2.文件名: 实验结果及分析: 1.源代码: #include #include charc[100][50]; charf[300][50]; intN,sum=0;//N为输入码字的个数,sum为尾随后缀集合中码字的个数 intflag;//判断是否唯一可译标志位 voidpatterson(charc[],chard[])//检测尾随后缀 { inti,j,k; for(i=0;;i++) { if(c[i]=='\0'&&d[i]=='\0')//2字符串一样,跳出 break; if(c[i]=='\0')//d比c长,将d的尾随后缀放入f中 { for(j=i;d[j]!='\0';j++)f[sum][j-i]=d[j]; f[sum][j-i]='\0'; for(k=0;k100) { printf("输入码字个数过大,请输入小于100的数\n"); printf("请输入码字的个数:"); scanf("%d",&N); } flag=0; printf("请分别输入码字:\n"); for(i=0;i中的功能,其作用为将int转换为string的类型,便于储存数据,其功能函数如下: voidyasuo(vectora){ intlength=(); //原数据的长度//保存压缩后的数据 //a传入要压缩的数据 vectortemp;intj=0;intn=1; for(inti=0;idata;vectorloca;vectorlen;vectorzhi; //记录数据//记录标志的位置//记录个数据的长度 //记录每个数据的各个位上的数值//记录数据和标志的位置 for(inti=0;i#include#definen1000intmain(void){ chars[n];inti,n=0; floatnum[27]={0}; doubleresult=0,p[27]={0};file*f; char*temp=newchar[485]; f=fopen(,r); while(!feof(f)){ fread(temp,1,486,f);}fclose(f); s[0]=*temp; for(i=0;i信息论数学编码报告)phabetstotheirASCIIcodeandthenperformthecompressionshouldoutputthecompressionthisprogram,findoutthecompressionachievedforthefollowingstringsofletters. (i)TheLempelZivalgorithmcancompresstheEnglishtextbyaboutfiftyfivepercent. (ii)Thecatcannotsitonthecanopyofthecar. 算法设计: 构建初始字典。 增添开始与结束标志位。 从第一个字符开始读入,以两个字符串为一组形成新的字符。 判断新的字符是否存在于字典中,如果存在,则不处理,如果不存在,则将新的字符存进字典中。 将新的字符在字典中的位置作为编码发送。 进行解码。 注: 编码时始终对字符和字符串进行操作,但发送的始终是对应的字典编