参考书《数据压缩导论(第4版)》 Page 100 5, 6
5、给定如表4-9所示的概率模型,求出序列a1a1a3a2a3a1 的实值标签。
从概率模型可知:
Fx(k)=0, k≤0, Fx(1)=0.2, Fx(2)=0.5, Fx(3)=1, k>3.
我们可以利用公式确定标签所在的上下限。将u(0)初始化为1,将l(0)初始化为0。
该序列的第1个元素为a1,利用更新公式,可得:
l(1) =0+(1-0)Fx(0)=0
u(1) =0+(1-0)Fx(1)=0.2
因此,序列a1a1的标签所在的区间为[0,0.2),该序列的第2个元素为a1,利用更新公式,可得:
l(2) =0+(0.2-0)Fx(0)=0
u(2) =0+(0.2-0)Fx(1)=0.04
因此,序列a1a1的标签所在的区间为[0,0.04)。该序列的第3个元素为a3,利用更新公式,可得:
l(3) =0+(0.04-0)Fx(2)=0.02
u(3) =0+(0.04-0)Fx(3)=0.04
因此,序列a1a1a3的标签所在的区间为[0.02,0.04)。该序列的第4个元素为a2,利用更新公式,可得:
l(4) =0.02+(0.04-0.02)Fx(1)=0.024
u(4) =0.02+(0.04-0.02)Fx(2)=0.03
因此,序列a1a1a3a2的标签所在的区间为[0.024,0.03)。该序列的第5个元素为a3,利用更新公式,可得:
l(5) =0.024+(0.03-0.024)Fx(2)=0.027
u(5) =0.024+(0.03-0.024)Fx(3)=0.03
因此,序列a1a1a3a2a3的标签所在的区间为[0.027,0.03)。该序列的第6个元素为a1,利用更新公式,可得:
l(6) =0.027+(0.03-0.027)Fx(0)=0.027
u(6) =0.027+(0.03-0.027)Fx(1)=0.0276
可以生成序列a1a1a3a2a3a1的标签如下:
Tx(a1a1a3a2a3a1)=(0.027+0.0276)/2=0.0273
6、对于表4-9所示的概率模型,对于一个标签为0.63215699的长度为10的序列进行解码。
#include<iostream> using namespace std; int main() { double u[11],l[11],F[4];; u[0]=1;l[0]=0; F[0]=0;F[1]=0.2;F[2]=0.5;F[3]=1; double x=0.63215699; for(int i=1;i<11;i++) { for(int j=1;j<4;j++) { l[i]=l[i-1]+(u[i-1]-l[i-1])*F[j-1]; u[i]=l[i-1]+(u[i-1]-l[i-1])*F[j]; if(x>=l[i]&&x<u[i]) { cout<<j; break; } } } return 0; }
运行结果如下图所示:
综上所述:该序列为a3a2a2a1a2a1a3a2a2a3