一、参考书《数据压缩导论(第4版)》  Page 100   

      5, 6

5、给定如表4-9所示的概率模型,求出序列a1a1a3a2a3a1 的实值标签。

解:由上图可知,

                     p(a1)=0.2 ,p(a2)=0.3  ,p(a3)=0.5

                     FX(0)=0,FX(1)=0.2 ,FX(2)=0.5  ,FX(3)=1.0, U(0)=1 ,L(0)=0

                     因为X(ai)=i,    所以  X(a1)=1,X(a2)=2,X(a3)=3

                     由公式,L(n)=L(n-1)+(U(n-1)-L(n-1))Fx(xn-1)

                                 u(n)=L(n-1)+(U(n-1)-L(n-1))Fx(xn)

第一次出现a1时,有:

                             L(1)=L(0)+(U(0)-L(0))Fx(0)=0

                             U(1)=L(0)+(U(0)-L(0))Fx(1)=0.2

第二次出现a1时,有:

                             L(2)=L(1)+(U(1)-L(1))Fx(0)=0

                             U(2)=L(1)+(U(1)-L(1))Fx(1)=0.04

第三次出现a3时,有:

                             L(3)=L(2)+(U(2)-L(2))Fx(2)=0.02

                             U(3)=L(2)+(U(2)-L(2))Fx(3)=0.04

第四次出现a2时,有:

                             L(4)=L(3)+(U(3)-L(3))Fx(1)=0.024

                             U(4)=L(3)+(U(3)-L(3))Fx(2)=0.03

第五次出现a3时,有:

                             L(5)=L(4)+(U(4)-L(4))Fx(2)=0.027

                             U(5)=L(4)+(U(4)-L(4))Fx(3)=0.03

第六次出现a1时,有:

                            L(6)=L(5)+(U(5)-L(5))Fx(0)=0.027

                           U(6)=L(5)+(U(5)-L(5))Fx(1)=0.0276

所以,序列a1a1a3a2a3a1的实值标签为:T(113231)=(L(6)+ U(6))/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 a=1;a<11;a++)
    {
        for(int b=1;b<4;b++)
        {
            L[a]=L[a-1]+(U[a-1]-L[a-1])*F[b-1];
            U[a]=L[a-1]+(U[a-1]-L[a-1])*F[b];
            if(x>=L[a]&&x<U[a])
            {
                cout<<b;
                break;
            }
                
        }        
    }
    
    return 0;
}

  

由上图可知,进行编码的结果为:3221213223。