参考书《数据压缩导论(第4版)》Page 30
3、给定符号集A={a1,a2,a3,a4},求一下条件下的一阶熵:
(a)P(a1)=P(a2)=P(a3)=P(a4)=1/4
(b)P(a1)=1/2 , P(a2)=1/4 , P(a3)=P(a4)=1/8
(c)P(a1)=0.505 , P(a2)=1/4 , P(a3)=1/4 , P(a4)=0.12
解:
因为:熵 H = -pi * log(pi) (i从1到m),
则有:
( a ) H = 4*1/4*(-log2(1/4))
= 2 (bit).
( b )H=-1/2log21/2 -1/4*log21/4 -2*1/8*log21/8
=1.75 (bit).
( c ) H=-0.505*log20.505 + 1/4*log24 + 1/4*log24 - 0.12*log20.12
=-0.505*log20.505 +2*1/4*log24 - 0.12*log20.12
= 0.5 + 1 + 0.37
=1.87(bit).
5.考虑以下序列:
ATGCTTACGTGCTTAACCTGAAGCTTCCGCTGAAGAACCTG
CTGAACCCGCTTAAGCTGAACCTTCTGAAGCTTAACCTGCTT
(a)根据此序列估计个概率值,并计算这一序列的一阶、二阶、三阶、四阶熵。
解:
序列中有字母84个,其中A出现21次,T出现23次,G出现16次,C出现24次,
得出每个字母的概率值如下:
P(A)=21/84=1/4、P(C)=24/84=2/7、P(G)=16/84=4/21、P(T)=23/84.
则熵为: H = 1/4*log24-2/7*log2(2/7) -4/21*log2(4/21) -23/84*log2(23/84)
= 1.98(bit).
7.(a)编写一段程序,从包括26个字母的符号集{a,b,...,z}中随机选择字母,组成100个四字母单词,这些单词中有多少个是有意义的?
答:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
int a,i,j;
char m[100][100];
for(i=0;i<100;i++)
{
for(j=0;j<4;j++)
{
a=rand()%26;
m[i][j]=a+‘a‘;
}
m[i][4]=‘\0‘;
printf("%d: %s \t",i+1,m[i]);
}
return 0;
}