唯一可译码的判别.docx
- 文档编号:5870326
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:10
- 大小:39.54KB
唯一可译码的判别.docx
《唯一可译码的判别.docx》由会员分享,可在线阅读,更多相关《唯一可译码的判别.docx(10页珍藏版)》请在冰豆网上搜索。
唯一可译码的判别
信息论与编码技术
课程设计(论文)
设计(论文)题目
唯一可译码的判别
学院名称
管理科学学院
专业名称
信息与计算科学
学生姓名
曹昌杰
学生学号
201307020102
指导教师
乐千桤
设计(论文)成绩
教务处制
2015年12月12日
唯一可译码的判别
摘要
唯一可译码的判别原理是:
设S0为原始码字的集合,再构造一系列集合S1,S2,…为得到集合S1,首先考察S0中所有的码字。
若码字ωj是码字ωi的前缀,即ωi=ωjA,则将后缀A列为S1中的元素,S1是由所有具有这种性质的A构成的集合。
再从新产生的集合中拿出一个元素,从原始集合S0中拿出一个元素,看有没有一个码字是另一个码字的前缀这种情况,如果有就将后缀放入更新的集合中,直到更新的集合为空集为止,一种码是唯一可译码的充要条件是S1,S2,…中没有一个含有S0中的码字。
关键词:
原始码字;前缀;后缀;更新集合;空集
第1章前言
1.1内容及要求(或课题背景)
对于用户输入指定的编码个数及编码,判断出输入的码为唯一可译码。
1.2本文研究思路及结构安排
设计判定唯一可译码的思路如下:
1)、考察S0中所有的码字。
若码字ωj是码字ωi的前缀,即ωi=ωjA,则将后缀A列为S1中的元素,构造S1。
2)、从新产生的集合中拿出一个元素,从原始集合S0中拿出一个元素,找有没有一个码字是另一个码字的前缀这种情况,如果有,就将后缀放入更新的集合中。
3)、如此构造的S1,S2,…集合中没有一个含有S0中的码字,此编码即为唯一可译码,否则,该编码不是唯一可译码。
第2章相关理论知识
唯一可译码充要判定条件:
设S0为原始码字的集合,再构造一系列集合S1,S2,…为得到集合S1,首先考察S0中所有的码字。
若码字ωj是码字ωi的前缀,即ωi=ωjA,则将后缀A列为S1中的元素,S1是由所有具有这种性质的A构成的集合。
再从新产生的集合中拿出一个元素,从原始集合S0中拿出一个元素,看有没有一个码字是另一个码字的前缀这种情况,如果有就将后缀放入更新的集合中,直到更新的集合为空集为止,若S1,S2,…中没有一个含有S0中的码字,则为唯一可译码。
第3章算法设计与分析
1)、虽然编码为数字编码,但如“001”、“010”类型的编码不能使用int类型数组进行存储,因为编码为字符串类型,尝试用二维字符数组去存储它们,考虑到还有字符串长度等变量,可以使用一个Code的结构体去存储。
2)进行判断的第一步,首先考虑S0内部,若码字ωj是码字ωi的前缀,即ωi=ωjA,则将后缀A列为S1中的元素,构造S1。
否则,可以直接判定该编码为唯一可译码。
3)从新产生的集合中拿出一个元素,从原始集合S0中拿出一个元素,找有没有一个码字是另一个码字的前缀这种情况,如果有,就将后缀放入更新的集合中。
直到这个更新的集合为空集为止。
4)、比较构造的S1,S2,…集合中没有一个含有S0中的码字,此编码即为唯一可译码,否则,该编码不是唯一可译码。
第4章程序实现与测试
程序运行截图如下:
1、输入唯一可译码:
01、10、00、11
2、输入非唯一可译码:
00、101、001、100、111、000
第5章结论
在定理“对任意的正整数N,如果一种编码方法的N次扩展码都是非奇异的,则该编码方法就是唯一可译码”对唯一可译码的判定显然在实际应用中很难发挥作用,因为不可能一一检查所有N次扩展码的奇异性。
但可以通过构造后缀集合的方式,在结论“一种码是唯一可译码的充要条件是S1,S2,…集合中没有一个含有S0中的码字”下(S1,S2,…集合均是后缀集合)可以很好地解决唯一可译码的判定问题。
参考文献
[1]
[2]姜楠.王健信息论与编码理论[M].北京:
清华大学出版社.2010年5月.
附录:
源程序清单
#include
#include
structCode
{
charcode[100][10];
intlen[100];
intp;//码字或尾缀的个数
};
intmain()
{
structCodes[100],F,C;
intN,i,j,l,t,p;
printf("输入码字的个数:
");
scanf("%d",&N);
printf("输入编码:
");
for(i=0;i { scanf("%s",s[0].code[i]); s[0].len[i]=strlen(s[0].code[i]); } s[0].p=N; F.p=0;p=0; //循环结束条件为新的尾缀和F中的尾缀比较若没有新的尾缀出现 while (1)//使循环一直执行下去,以break形式跳出 { C.p=0; s[p+1].p=0; for(i=0;i { for(j=0;j { if(i==j&&p==0)continue; if(s[0].len[i]>=s[p].len[j])continue; for(l=0;l { if(s[0].code[i][l]! =s[p].code[j][l])break; } if(l==s[0].len[i])//将尾缀存到s[p+1]中 { t=0; for(;l { s[p+1].code[s[p+1].p][t]=s[p].code[j][l]; t++; } s[p+1].code[s[p+1].p][t]='\0'; s[p+1].len[s[p+1].p]=t; s[p+1].p++; } } } for(j=0;j { if(p==0)break; for(i=0;i { if(s[0].len[i]<=s[p].len[j])continue; for(l=0;l { if(s[p].code[j][l]! =s[0].code[i][l])break; } if(l==s[p].len[j])//将尾缀存到s[p+1]中 { t=0; for(;l { s[p+1].code[s[p+1].p][t]=s[0].code[i][l]; t++; } s[p+1].code[s[p+1].p][t]='\0'; s[p+1].len[s[p+1].p]=t; s[p+1].p++; } } } p++; t=F.p; //还要判断s[p]中是否有相同的元素 for(i=0;i { for(j=i+1;j { if(strcmp(s[p].code[i],s[p].code[j])==0)break; } if(j==s[p].p) { for(l=0;l { C.code[C.p][l]=s[p].code[i][l]; } C.code[C.p][l]='\0'; C.len[C.p]=l; C.p++; } } //比较C[p]和F中的元素 //并判断C[p]中是否有新的元素 for(i=0;i { for(j=0;j { if(strcmp(C.code[i],F.code[j])==0)break; } if(j==t)//表示没有相同的元素,表示有新的尾缀出现 { for(l=0;l { F.code[F.p][l]=C.code[i][l]; s[p].code[F.p-t][l]=C.code[i][l]; } F.code[F.p][l]='\0'; s[p].code[F.p-t][l]='\0'; F.len[F.p]=l; F.p++; } } if(F.p-t==0)break; } //将F中的尾缀和s[0]中的码字进行比较 for(i=0;i { for(j=0;j { if(strcmp(s[0].code[i],F.code[j])==0)break; } if(j! =F.p) { printf("此编码不是唯一可译码! \n"); printf("尾缀集合为: "); for(t=0;t { printf("%s",F.code[t]); } printf("\n"); break; } } if(i==s[0].p) { printf("此编码是唯一可译码! \n"); printf("尾缀集合为: "); for(t=0;t { printf("%s",F.code[t]); } printf("\n"); } return0; } 学生学习心得 通过本次的上机实习,我深刻认识到了自己在编程方面的不足之处,不能灵活的将算法运用到编程之中,需要以后在学习过程中不断实践,不断努力来提高自己的编程水准,并且在信息论方面的知识没有建立足够的体系,在实验过程中,表现出对知识点的不熟悉。 学生(签名): 年月日 诚信承诺 本人郑重声明所呈交的课程报告是本人在指导教师指导下进行的研究工作及取得的研究成果。 据我所知,除了文中特别加以标注的地方外,论文中不包含其他人已经发表或撰写过的研究成果。 与我一同工作的同学对本文研究所做的贡献均已在报告中作了明确的说明并表示谢意。 学生(签名): 任课 教师 评语 成绩评定: 任课教师(签名): 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 唯一可译码 判别