信息论课程设计报告Word文件下载.docx

上传人:b****2 文档编号:14321214 上传时间:2022-10-22 格式:DOCX 页数:31 大小:110.34KB
下载 相关 举报
信息论课程设计报告Word文件下载.docx_第1页
第1页 / 共31页
信息论课程设计报告Word文件下载.docx_第2页
第2页 / 共31页
信息论课程设计报告Word文件下载.docx_第3页
第3页 / 共31页
信息论课程设计报告Word文件下载.docx_第4页
第4页 / 共31页
信息论课程设计报告Word文件下载.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

信息论课程设计报告Word文件下载.docx

《信息论课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《信息论课程设计报告Word文件下载.docx(31页珍藏版)》请在冰豆网上搜索。

信息论课程设计报告Word文件下载.docx

判决结果(是/不是)

输入文件:

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]<

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1