📄 shannon.cpp
字号:
#include"stdio.h"
#include"math.h"
#define N 30
//////////////////////////排序///////////////////////////////////////////
void sort(float p[N],int n)
{
int i,j,k;
float t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(p[j]>p[k]) k=j;
t=p[k];p[k]=p[i];p[i]=t;
}
}
//////////////////////////shannon 编码///////////////////////////////////
void shannon(float p[N],int n,float H)
{
int i,j;
int k[N]; //码字长度
float compare_val[N]; //求其二进制编码比较值
compare_val[0]=0.5;
int code[N]; //码字
for(i=1;i<N;i++)
{
compare_val[i]=compare_val[i-1]/2;
}
for(i=0;i<N;i++)
{
k[i]=-log(p[i])/log(2)+1;
}
float P[N]; //累加概率
P[0]=0;
for(i=0;i<N-1;i++)
{
P[i+1]=P[i]+p[i];
}
printf("===================================\n");
printf("shannon Encode: chy\n");
printf("probability - shannonCode\n");
for(i=0;i<n;i++) //对各个信源符号进行编码
{
printf("%-15.2f",p[i]);
for(j=0;j<k[i];j++)
{
if(P[i]>compare_val[j])
{code[j]=1; P[i]=P[i]-compare_val[j];}
else code[j]=0;
printf("%d",code[j]);
}
printf("\n");
}
printf("===================================\n");
// printf("END\n");
float K; //平均信息率
K=0;
for(i=0;i<N;i++)
{
K=K+p[i]*k[i];
}
float yita;
yita=H/K;
printf("Calculate the efficiency of shannon:\n");
printf("yita=%f\n",yita);
}
void main()
{
int i;
int n;
printf("n=");
scanf("%d",&n);
float p[N];
printf("input the possibility value of n symbols:\n");
for(i=0;i<n;i++)
scanf("%f",&p[i]);
sort(p,n);
float H; //信源符号的信息熵
H=0;
for(i=0;i<n;i++)
{
H=H+p[i]*log(p[i])/log(2);
}
H=-H;
shannon(p,n,H);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -