唯一可译码的判别
信息论与编码技术课程设计(论文)设计(论文)题目唯一可译码的判别管理科学学院专业名称信息与计算科学学生姓名曹昌杰学生学号201307020102指导教师乐千桤设计(论文)成绩
教务处 制
2015 年 12 月 12 日
唯一可译码的判别0为原始码字的集合再构造一系列集合1,S2,…为得到集合1,首先考察0中所有的码字若码字ωωi的前缀即ωiωjA,则将后缀1中的元素1是由所有具有这种性质的0中拿出一个元素看有没有一个码字是另一个码字的前缀这种情况如果有就将后缀放入更新的集合中直到更新的集合为空集为止一种码是唯一可译码的充要条件是1,S2,…中没有一个含有0中的码字第1章 前 言
1.1内容及要求(或课题背景)
对于用户输入指定的编码个数及编码,判断出输入的码为唯一可译码。
1.2 本文研究思路及结构安排
设计判定唯一可译码的思路如下:
1)、考察0中所有的码字。若码字ωωi的前缀,即ωiωjA,则将后缀1中的元素构造1。
2)、从新产生的集合中拿出一个元素,从原始集合S0中拿出一个元素找有没有一个码字是另一个码字的前缀这种情况如果有就将后缀放入更新的集合中
3)、如此构造的S1,S2,…集合中没有一个含有0中的码字此编码即为唯一可译码否则该编码不是唯一可译码第2章 相关理论知识
唯一可译码充要判定条件:设S0为原始码字的集合,再构造一系列集合1,2,…为得到集合1,首先考察0中所有的码字。若码字ωωi的前缀,即ωi=ωA,则将后缀1中的元素,1是由所有具有这种性质的0中拿出一个元素,看有没有一个码字是另一个码字的前缀这种情况,如果有就将后缀放入更新的集合中,直到更新的集合为空集为止,若1,2,…中没有一个含有0中的码字,则为唯一可译码。第3章 算法设计与分析
1)、虽然编码为数字编码,但如“001”、“010”类型的编码不能使用int类型数组进行存储,因为编码为字符串类型,尝试用二维字符数组去存储它们,考虑到还有字符串长度等变量,可以使用一个Code的结构体去存储。
2)进行判断的第一步,首先考虑S0内部若码字ωωi的前缀,即ωiωjA,则将后缀1中的元素构造1。否则,可以直接判定该编码为唯一可译码。
3)从新产生的集合中拿出一个元素,从原始集合S0中拿出一个元素找有没有一个码字是另一个码字的前缀这种情况如果有就将后缀放入更新的集合中
4)、比较构造的S1,S2,…集合中没有一个含有0中的码字此编码即为唯一可译码否则该编码不是唯一可译码第4章 程序实现与测试
程序运行截图如下
输入唯一可译码:01、10、00、11
输入非唯一可译码:00、101、001、100、111、000
第5章 结 论
在定理“对任意的正整数N,如果一种编码方法的N次扩展码都是非奇异的,则该编码方法就是唯一可译码”对唯一可译码的判定显然在实际应用中很难发挥作用,因为不可能一一检查所有N次扩展码的奇异性。但可以通过构造后缀集合的方式,在结论“一种码是唯一可译码的充要条件是S1,S2,…集合中没有一个含有0中的码字1,S2,…集合参考文献
[1] /view/c818007201f69e3143329426.html
[2] 姜楠.王健 .北京:清华大学出版社.2010年5月.
附录:源程序清单
#include
#include
struct Code
{
char code[100][10];
int len[100];
int p; //码字或尾缀的个数
};
int main()
{
struct Code s[100],F,C;
int N,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]>=