?? 信息論哈夫曼編碼.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 + -