zhoujie信息论编码文档格式.docx
- 文档编号:20514322
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:20
- 大小:160.87KB
zhoujie信息论编码文档格式.docx
《zhoujie信息论编码文档格式.docx》由会员分享,可在线阅读,更多相关《zhoujie信息论编码文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
由于需要判断尾随后缀,所以我们需要反复的比较C和F中的码字。
1)首先我们用一个b[40][40]的数组来存放所有的尾随后缀的集合;
用Q记录所有尾随后缀的个数;
2)用数组a[40][40]来存放输入的码字,L[50]来存放码字的长度;
通过一个双重循环并调用Hz(a[i],a[j],L[i],L[j])函数来找到a[40][40]中的为随后缀,即:
for(i=0;
i<
n-1;
i++)
{
for(j=0;
j<
n;
j++)
{
if(i!
=j&
&
L[i]<
L[j])
Hz(a[i],a[j],L[i],L[j]);
}
}
3)通过判断Q是否大于0,如果不大于0,即b[40][40]中没有码字,也就是不存在尾随后缀,那么可判断a[40][40]是唯一可译码,否则进行如下操作;
4)计算b[40][40]中尾随后缀的长度,用k1表示;
并调用Hz(b[i],a[j],k1,L[j])其中k1<
L[j]来a[40][40]中所存在的后缀,并加入到b[40][40]中,通过一个循环,找到a[40][40]中所有尾随后缀;
即
for(i=0;
Q;
k1=strlen(b[i]);
for(j=0;
if(k1<
Hz(b[i],a[j],k1,L[j]);
}
5)寻找b[40][40]中的尾随后缀;
用k2表示b[40][40]中码字的长度,并调用Hz(a[i],b[j],L[i],k2)来实现,其中k2>
L[j];
通过循环调用即可找到b[40][40]中的所有尾随后缀,最后再将他们分别存放在b[40][40]中;
即通过
k2=strlen(b[j]);
if(k2>
L[i])
{
Hz(a[i],b[j],L[i],k2);
6)在反复调用Hz(a[i],a[j],L[i],L[j])函数中如果b[40][40]中有重复出现的,即尾随后缀相同的不用再次放入b[40][40]中。
7)在调用函数中所需要注意的问题就是一个比较的问题,也就是实现6)中所提到的。
四、测试结果
4.1、测试数据为0101100111010111101
4.2、测试数据为110111000010
五、源代码
#include<
stdio.h>
string.h>
charb[40][40];
intQ;
voidHz(charc[],chard[],intL1,intL2)
{
inti,j,temp=0;
charm[50];
L1;
{
if(c[i]==d[i])continue;
elsebreak;
}
if(i==L1)
L2-L1;
m[j]=d[L1+j];
m[j]='
\0'
;
if(strcmp(b[i],m)==0)
temp=1;
break;
if(temp!
=1)
strcpy(b[Q],m);
Q++;
}
voidmain()
inti,j,k,k1,k2,n;
chara[40][40];
intL[50];
inttemp=1;
intf=0;
printf("
请输入码字个数:
"
);
scanf("
%d"
&
n);
请分别输入码字:
"
scanf("
%s"
a[i]);
L[i]=strlen(a[i]);
for(j=0;
if(i!
if(Q>
0)
for(i=0;
if(k1<
Hz(b[i],a[j],k1,L[j]);
for(k=0;
k<
k++)
for(j=0;
k2=strlen(b[j]);
if(k2>
L[k])
{
Hz(a[k],b[j],L[k],k2);
}
printf("
尾随后缀集合为:
printf("
%s"
b[i]);
n&
temp!
=0;
if(strcmp(a[i],b[j])==0)
temp=0;
elsecontinue;
\n"
if(temp==0)printf("
该码不是唯一可译码!
elseprintf("
该码是唯一可译码!
elseprintf("
该码组是唯一可译码!
f++;
实习二:
香农编码
一、题目分析
对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。
二、算法分析
2.1、算法基本原理
给定某个信源符号的概率分布,通过以下的步骤进行香农编码:
1)信源符号按概率从大到小排列;
2)对信源符号求累加和,表达式:
Pi=Pi-1+p(xi);
3)求自信息量,确定码字长度。
自信息量I(xi)=-log(p(xi));
码字长度取大于等于自信息量的最小整数;
4)将累加和用二进制表示,并取小数点后码字的长度的码。
2.2、主要函数设计及分析
1)paixu()函数
本函数的功能主要是对用户输入的各个符号对应的概率进行降序排列,以便于计算累加概率和编码。
for(j=i+1;
if(p[i]<
p[j])
e=p[i];
p[i]=p[j];
p[j]=e;
2)length()函数
本函数的功能主要是求每个符号概率对应码字的长度。
I=-log(p[i])/log
(2);
m=int(I);
k[i]=m+1;
3)mazi()函数
本函数的功能主要是将累加概率转换为二进制,从而根据码长计算出相应的码字,在这里用到对浮点数转换为二进制的算法。
s=pa[i];
k[i];
s=2*s;
if(s>
=1)
str[i]+="
1"
s=s-1;
elsestr[i]+="
0"
三、测试结果
测试数据为:
0.200.190.170.150.100.010.18
四、分析与探讨
只是在对概率取对数并向上取整时遇到一定的困难,经过思考,利用上述的模拟手工出发圆满的解决了这一难题,使得程序能够得以完成。
iostream>
math.h>
string>
usingnamespacestd;
voidpaixu(double*p,intn)
inti,j;
doublee=0.0;
voidleijia(double*p,double*pa,intn)
inti;
doublesum=0.0;
pa[i]=sum;
sum+=p[i];
voidlength(double*p,int*k,intn)
inti,m;
doubleI;
voidmazi(int*k,double*pa,string*str,intn)
doubles;
intn,i;
cout<
<
信源符号个数n="
cin>
>
double*p=newdouble[n];
信源符号的概率依次为:
cin>
p[i];
paixu(p,n);
double*pa=newdouble[n];
leijia(p,pa,n);
int*k=newint[n];
length(p,k,n);
string*str=newstring[n];
mazi(k,pa,str,n);
\t"
p(ai)"
Pa(aj)"
Ki"
<
码字"
endl;
{
cout<
p[i]<
pa[i]<
k[i]<
str[i]
<
实习三、费诺编码
对于给定的信源的概率分布,按照费诺编码的方法进行计
1)、将信源发出的N个消息符号按其概率的递减次序依次排列。
2)、将依次排列的信源符号依概率分成两组,使两个组的概率和近于相同,并对各组赋予一个二进制代码符号“0”和“1”(编m进制码就分成m组)。
3)、将每一个大组的信源符号进一步再分成两组,使划分后的两个组的概率和近于相同,并又分别赋予两组一个二进制符号“0”和“1”
4)、如此重复,直至每组值只剩下一个信源符号为止
5)、信源符号所对应的码符号序列即为费诺码
否
是
2.2、函数详细设计及分析
1)main()函数
本函数实现的主要功能有:
实现需要编码符号相关信息的输入;
判断输入的概率和是否为1;
调用费诺编码函数fano();
对排序后的概率进行编码并输出编码结果。
2)fano()函数
本函数的主要功能是实现编码过程的2)和3)。
本函数是一个递归函数
分组代码如下:
fano(floatp[],inta[M][M],intn,intm,intk)
floatg=0.0,h=0.0,d,b,c;
inti,j,flase=0;
if(n<
m)
for(i=n;
=m;
g=p[i]+g;
}g=g/2;
h=h+p[i];
if(h>
g)
{
d=h-p[i];
b=h-g;
c=g-d;
if(c>
b)
for(j=n;
=i;
j++)a[j][k]=0;
fano(p,a,n,i,k+1);
j++)a[j][k]=1;
fano(p,a,i+1,m,k+1);
else
for(j=n;
=i-1;
fano(p,a,n,i-1,k+1);
for(j=i;
fano(p,a,i,m,k+1);
break;
0.320.220.180.160.080.04
运行结果为:
费诺编码应该是概率小的符号码字长度一定大于概率大的符号的码字长度,但是符号码字的长度和概率的大小没有绝对的关系,只能说一般情况下,概率小的符号码字长度大于概率大的符号的码字长度。
iostream.h>
#defineM25
intpa[M][M];
voidfano(floatp[],inta[M][M],intn,intm,intk)
inti,j,k[M],n,flase=0;
floatp[M],m=0.0,sum=0.0;
输入信源符号个数"
输入各信源符号概率"
for(i=1;
=n;
sum=sum+p[i];
{
if(p[i]<
0.0||p[i]>
1.0||sum!
=1.0)
{cout<
输入错误!
flase=1;
break;
}
if(flase==0)
j++)
{pa[i][j]=10;
fano(p,pa,1,n,1);
cout<
信源费诺编码如下:
{k[i]=0;
x"
="
\t码字为\t"
for(j=1;
if(pa[i][j]!
=10)
{cout<
pa[i][j];
k[i]++;
\t码长为\t"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- zhoujie 信息论 编码
![提示](https://static.bdocx.com/images/bang_tan.gif)