信息论.docx
《信息论.docx》由会员分享,可在线阅读,更多相关《信息论.docx(10页珍藏版)》请在冰豆网上搜索。
![信息论.docx](https://file1.bdocx.com/fileroot1/2022-12/7/a1e61080-0274-4cdf-84ae-2b1f29d06f50/a1e61080-0274-4cdf-84ae-2b1f29d06f501.gif)
信息论
题目:
信息论上机实习报告
姓名:
刘彬
班级:
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;iscanf("%s",shan[i].XYFH);
printf("请输入信源概率:
\n");
for(i=0;iscanf("%lf",&shan[i].XYGL);
for(j=0;jfor(i=0;iif(shan[i].XYGL{
X=shan[i];
shan[i]=shan[i+1];
shan[i+1]=X;
}
for(i=1,shan[0].LJGL=0;ishan[i].LJGL=shan[i-1].LJGL+shan[i-1].XYGL;
for(i=0;ifor(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;jprintf("%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;ifor(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;kif(F[i][k]!
=C[j][k])
break;
if(k==L1)
{
L3=L2-L1;
for(m=0;ma[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;ifor(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;kif(C[i][k]!
=F[j][k])
break;
if(k==L1)//将后缀给a数组
{
L3=L2-L1;
for(m=0;ma[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;iscanf("%s",C[i]);
for(i=0;ifor(j=i+1;j{
if(strcmp(C[i],C[j])<0)
{L1=strlen(C[i]);
L2=strlen(C[j]);
for(k=0;kif(C[i][k]!
=C[j][k])
break;
if(k==L1)
{
L3=L2-L1;
for(m=0;ma[m]=C[j][k];
a[m]='\0';
for(m=0;mif(strcmp(F[m],a)==0)
flag1=1;
if(flag1!
=1)
{
strcpy(F[N],a);
N++;
}
}
}
}
X(N);
}
运行结果