信息论课程设计报告Word文件下载.docx
《信息论课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《信息论课程设计报告Word文件下载.docx(31页珍藏版)》请在冰豆网上搜索。
判决结果(是/不是)
输入文件:
in1.txt,含至少2组码,每组的结尾为”$”符
输出文件:
out1.txt,对每组码的判断结果
说明:
为了简化设计,可以假定码字为0,1串
2.实现原理
判断方法:
将码C中所有码字可能的尾随后缀组成一个集合F,当且仅当集合F中没有
包含任一码字,则可判断此码C为唯一可译变长码。
构成集合F:
首先观察码C中最短的码字是否是其他码字的前缀。
若是,将其所有可能
的尾随后缀排列出。
就是将其他码字序列中截去与其最短码字相同的前缀
部分,将余下的序列为尾随后缀。
而这些尾随后缀又可能是某些码字的前
缀,或者最短码字又仍是这些尾随后缀的前缀,再将由这些尾随后缀产生
的新的尾随后缀列出。
然后再观察这些新的尾随后缀是否是某些码字的前
缀,或观察有否其他码字是这些新的尾随后缀的前缀,再将产生的尾随后
缀列出,依次下去,直至没有一个尾随后缀是码字的前缀或没有新的尾随
后缀产生为止。
这样,首先获得的是由最短码字能引起的所有尾随后缀。
接着,按照上述步骤将次短的码字、......所有码字可能产生的尾随后缀前部
列出。
由此得到由码C的所有可能的尾随后缀组成的集合F。
参考算法伪代码:
Foralldo
if是的前缀then
将相应的后缀作为一个尾随后缀放入集合中
Endif
Endfor
Loop
Foralldo
Elseif是的前缀then
Endfor
Ifthen
Returnfalse
ElseifF中未出现新的元素then
Returntrue
//能走到这里,说明F中有新的元素出现,需继续
Endloop
3.实现源码
#include<
iostream>
fstream>
stdio.h>
string.h>
usingnamespacestd;
#pragmawarning(disable:
4996)
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]=='
)//两字符串一样长,跳出
break;
if(c[i]=='
)//d比c长,将d的尾随后缀放入f中
{
for(j=i;
d[j]!
='
j++)
f[sum][j-i]=d[j];
f[sum][j-i]='
for(k=0;
k<
sum;
k++)
{
if(strcmp(f[sum],f[k])==0)/*查看当前生成的尾随后缀在f集合中
是否存在*/
{
sum--;
break;
}
}
sum++;
}
if(d[i]=='
)//c比d长,将c的尾随后缀放入f中
{
c[j]!
f[sum][j-i]=c[j];
if(strcmp(f[sum],f[k])==0)/*查看当前生成的尾随后缀在f集合中
sum--;
if(c[i]!
=d[i])//字符不一样了也退出(前缀不同)
}
}
voidmain(){
intk=0,N=0,m=0,a[50],z=0;
a[m]=N;
m++;
fstreamfile1;
file1.open("
out1.txt"
);
//码字读取
FILE*file;
file=fopen("
in1.txt"
"
r+"
intnum=fgetc(file)-48;
for(intn=0;
n<
num;
n++){
inti=0,j;
if(fgetc(file)=='
'
)
N+=(fgetc(file)-48);
elseN+=(fgetc(file)-48);
a[m]=N;
fgetc(file);
for(k;
k<
N;
k++){
for(intq=0;
q++){
chartemp=fgetc(file);
c[k][q]=temp;
if(temp=='
||temp=='
$'
){
c[k][q]='
break;
//生成尾随后缀
flag=0;
for(i=a[z];
i<
N-1;
i++)//判断码本身是否重复
for(j=i+1;
j<
N;
if(strcmp(c[i],c[j])==0)
flag=1;
if(flag==1)//如果码本身有重复,就可以断定它不是唯一可译码
for(inty=a[z];
y<
y++)
file1<
<
c[y]<
file1<
"
不是唯一可译码。
\n"
else
for(i=a[z];
i++)/*将原始码字生成的尾随后缀集合s[1]放入f
中*/
for(j=i+1;
patterson(c[i],c[j]);
for(i=0;
i++)//根据原始码与s[i]生成s[i+1]也放入f[i]
ints=0;
for(j=a[z];
j++)/*判断s[i+1]中的字符串是否与s[i]中一
样,重复的则不再添加*/
if(i==sum)
{
s=1;
}
else
patterson(f[i],c[j]);
if(s==1)break;
i++)/*判断尾随后缀与原始码字是否相同,
相同则不是唯一可译码*/
if(strcmp(f[i],c[j])==0)
flag=1;
break;
if(flag==1)
for(inty=a[z];
file1<
else{
是唯一可译码。
file1<
尾随后缀集合为:
"
for(i=0;
i<
sum;
f[i]<