📄 信息论哈夫曼编码.txt
字号:
#include "stdio.h"
#include "math.h"
main()
{
float a[100]={0};
float f;
int i,j,k;
int x,y;
int n;
float sum1=0,sum2=0,sum3=0;
printf("设信号源有n个符号,n=");
scanf("%d",&n);
printf("请输入这些符号的概率,概率由高到低输入:\n");
AGAIN:
for(i=1;i<=n;i++)
{
scanf("%f",&a[i]);
}
for(i=1;i<=n;i++)
{
sum1=sum1+a[i];
}
printf("输出结果:");
if(sum1!=1)
{
printf("\n概率和为:p[a1]+p[a2]+...+p[a%d]=%.2f ",n,sum1);
printf("概率和不等于1,输入概率有误。\n请重新输入:\n");
sum1=0;
goto AGAIN;
}
for(j=2;j<n+2;j++)
{
a[n+1]=a[n+1]+a[j-2];
printf("\n符号概率p(a%d)=%.2f 累加概率P%d=%.2f ",j-1,a[j-1],j-1,a[n+1]);
f=log10(1/a[j-1])/log10(2);
printf("-logp(a%d)=%.2f ",j-1,f);
x=f;
a[n+2]=a[n+1];
if(x==f) printf("码长K%d=%d ",j-1,x);
else
{
x=x+1;
printf("码长K%d=%d ",j-1,x);
}
sum2=sum2+a[j-1]*x;
printf("码字: ");
for(y=0;y<x;y++)
{
a[n+2]=2*a[n+2];
if(a[n+2]<1) printf("0");
else
{
printf("1");
a[n+2]=a[n+2]-1;
}
}
}
for(k=1;k<=7;k++)
{
sum3=sum3+a[k]*log10(1/a[k])/log10(2);
}
printf("\n\n信源熵为 %.3f bit/符号\n",sum3);
printf("平均码长为 %.3f码元/符号\n",sum2);
printf("编码效率为 %.3f\n",sum3/sum2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -