信息论.docx

上传人:b****4 文档编号:4696187 上传时间:2022-12-07 格式:DOCX 页数:10 大小:695.97KB
下载 相关 举报
信息论.docx_第1页
第1页 / 共10页
信息论.docx_第2页
第2页 / 共10页
信息论.docx_第3页
第3页 / 共10页
信息论.docx_第4页
第4页 / 共10页
信息论.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

信息论.docx

《信息论.docx》由会员分享,可在线阅读,更多相关《信息论.docx(10页珍藏版)》请在冰豆网上搜索。

信息论.docx

信息论

 

 

题目:

信息论上机实习报告

姓名:

刘彬

班级:

123102

学号:

20101000234

指导老师:

余林琛

 

2012年11月21日

香农码

一、算法设计

1.将信源发出的信号按概率从小到大排列。

2.计算累加概率。

3.以2为底求对数定码长。

4.将概率变为二进制。

二、程序

#include

#include

#defineN7

voidmain()

{

structShannon

{charXYFH[10];

doubleXYGL;

doubleLJGL;

intLength;

inta[20];

}shan[N];

inti,j;

doublem,n;

structShannonX;

printf("请输入信源符号:

\n");

for(i=0;i

scanf("%s",shan[i].XYFH);

printf("请输入信源概率:

\n");

for(i=0;i

scanf("%lf",&shan[i].XYGL);

for(j=0;j

for(i=0;i

if(shan[i].XYGL

{

X=shan[i];

shan[i]=shan[i+1];

shan[i+1]=X;

}

for(i=1,shan[0].LJGL=0;i

shan[i].LJGL=shan[i-1].LJGL+shan[i-1].XYGL;

for(i=0;i

for(j=0,m=shan[i].LJGL;j<20;j++)

{m=m*2;

if(m>1)

{shan[i].a[j]=1;

m=m-1;

}

elseshan[i].a[j]=0;

}

for(i=0;i

{n=(double)(-1)*log(shan[i].XYGL)/log((double)2);

shan[i].Length=1+(int)n;}

printf("输出结果为:

\n");

for(i=0;i

{

printf("%s%lf%lf%d",shan[i].XYFH,shan[i].XYGL,shan[i].LJGL,shan[i].Length);

for(j=0;j

printf("%d",shan[i].a[j]);

printf("\n");

}

}

三、运行结果

二、费诺码

一、算法设计

1、将信源发出的N个符号按其概率的递减输入。

2、将依次排列的信源符号依概率分成两组,使两个组的概率和近于相同,并对各组赋予二进制代码符号“0”和“1”。

3、通过各信源概率与该分组中的总概率的一般就能性比较,选取与总概率相差最小的进行分组。

4、如此重复,直至每组值只剩下一个信源符号为止

二、程序

三、运行结果

三、唯一可译码

一、算法描述

1、考查C中所有的码字,若Wi是Wj的前缀,则将相应

的后缀作为一个尾随后缀放入集合F0中;

2、考查C和Fi两个集合,若Wj∈C是Wi∈Fi的前缀Wi∈Fi是Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中;

3、F=∪Fi即为码C的尾随后缀集合;

4、若F中出现了C中的元素,则算法终止,返回假(C不是唯一译码);否则若F中没有出现新的元素,则返回真。

程序

#include

#include

charC[10][10],F[20][20];

intM,N2,N3;

voidX(intN1)

{

inti,j,k,m,L1,L2,L3,flag=0;

chara[10];

N2=N1;

for(i=0;i

for(j=0;j

{

if(strcmp(F[i],C[j])==0)//判断F,C集合有没有重复元素

{

printf("不是唯一可译码:

\n");

}

if(strcmp(F[i],C[j])<0)//判断F是不是C的前缀

{L1=strlen(F[i]);

L2=strlen(C[j]);

for(k=0;k

if(F[i][k]!

=C[j][k])

break;

if(k==L1)

{

L3=L2-L1;

for(m=0;m

a[m]=C[j][k];

for(m=m+1;m<10;m++)

a[m]='\0';

for(m=0;m

{

if(strcmp(F[m],a)==0)

{

flag=1;

break;

}

else

flag=0;

}

if(flag!

=1)//将后缀加入到F集合

{

strcpy(F[N2],a);

N2++;

}

}

}

}

if(N2==N1)

{

printf("是唯一可译码\n");

return;

}

N3=N2;

for(i=0;i

for(j=0;j

{

if(strcmp(C[i],F[j])==0)//判断F,C集合有没有重复元素

{

printf("不是唯一可译码\n");

}

if(strcmp(C[i],F[j])<0)//判断F是不是C的前缀

{L1=strlen(C[i]);

L2=strlen(F[j]);

for(k=0;k

if(C[i][k]!

=F[j][k])

break;

if(k==L1)//将后缀给a数组

{

L3=L2-L1;

for(m=0;m

a[m]=C[j][k];

for(m=m+1;m<10;m++)

a[m]='\0';

for(m=0;m

{

if(strcmp(F[m],a)==0)

flag=1;

elseflag=0;

}

if(flag!

=1)//将后缀加入到F集合

{

strcpy(F[N3],a);

N3++;

}

}

}

}

if(N3==N2)

{

printf("是唯一可译码\n");

return;

}

else

X(N3);

}

 

voidmain()

{

inti,j,m,k,L1,L2,L3,N=0,flag1=0;

chara[10];

printf("请输入信源的个数:

");

scanf("%d",&M);

printf("请输入信源符号:

");

for(i=0;i

scanf("%s",C[i]);

for(i=0;i

for(j=i+1;j

{

if(strcmp(C[i],C[j])<0)

{L1=strlen(C[i]);

L2=strlen(C[j]);

for(k=0;k

if(C[i][k]!

=C[j][k])

break;

if(k==L1)

{

L3=L2-L1;

for(m=0;m

a[m]=C[j][k];

a[m]='\0';

for(m=0;m

if(strcmp(F[m],a)==0)

flag1=1;

if(flag1!

=1)

{

strcpy(F[N],a);

N++;

}

}

}

}

X(N);

}

 

运行结果

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

当前位置:首页 > 初中教育 > 语文

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

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