第三次作业
参考书《数据压缩导论(第4版)》 Page 100
5.给定如表4-9所示的概率模型,求出序列a1a1a3a2a3a1的实值标签。
解答:由题可知:
a1,a2,a3的概率分别为: P(a1)=0.2 P(a2)=0.3 P(a3)=0.5
所以就有:F(a0)=0 F(a1)=0.2 F(a2)=0.5 F(a3)=1
根据公式 U(k) =L(k-1) +(U(k-1) -L(k-1) )*Fx(ak)
U(k) =L(k-1) +(U(k-1) -L(k-1) )*Fx(ak-1)
另注:U(0)=1 L(0)=0
有:
第一个出现的是a1
U(1) =L(0) +(U(0) -L(0) )*Fx(a1)=0.2
L(1) =L(0) +(U(0) -L(0) )*Fx(a0)=0
第二个出现的是a1
U(2) =L(1) +(U(1) -L(1) )*Fx(a1)=0.04
L(2) =L(1) +(U(1) -L(1) )*Fx(a0)=0
第三个出现的是a3
U(3) =L(2) +(U(2) -L(2) )*Fx(a3)=0.04
L(3) =L(2) +(U(2) -L(2) )*Fx(a2)=0.02
第四个出现的是a2
U(4) =L(3) +(U(3) -L(3) )*Fx(a2)=0.03
L(4) =L(3) +(U(3) -L(3) )*Fx(a1)=0.024
第五个出现的是a3
U(5) =L(4) +(U(4) -L(4) )*Fx(a3)=0.03
L(5) =L(4) +(U(4) -L(4) )*Fx(a2)=0.027
第六个出现的是a1
U(6) =L(5) +(U(5) -L(5) )*Fx(a1)=0.0276
L(6) =L(5) +(U(5) -L(5) )*Fx(a0)=0.027
则,序列a1a1a3a2a3a1的实值标签如下
TX(a1a1a3a2a3a1)=(U6+L6)/2=0.0273
6.对于表4-9给出的概率模型,对于一个标签为0.63215699的长度为10的序列进行解码。
解:根据题意可以得到的程序如下:
#include<stdio.h>
int main()
{
int m[20];
double F0=0,F1=0.2,F2=0.5,F3=1.0;
double tag=0.63215699,t1;
double l[20],u[20]; //l和u分别表示下界和上界
l[0]=0;
u[0]=1.0;
for(int j=1;j<=10;j++)
{
t1=(tag-l[j-1])/(u[j-1]-l[j-1]);
if(t1>F0&&t1<F1)
{
l[j]=l[j-1]+(u[j-1]-l[j-1])*F0;
u[j]=l[j-1]+(u[j-1]-l[j-1])*F1;
m[j]=1;
}
else if(t1>F1&&t1<F2)
{
l[j]=l[j-1]+(u[j-1]-l[j-1])*F1;
u[j]=l[j-1]+(u[j-1]-l[j-1])*F2;
m[j]=2;
}
else
{
l[j]=l[j-1]+(u[j-1]-l[j-1])*F2;
u[j]=l[j-1]+(u[j-1]-l[j-1])*F3;
m[j]=3;
}
printf("%d\n",m[j]);
}
return 0;
}
调试得到的结果是3221213223。