Elias Delta Coding

来源:互联网 发布:网络举报工作总结 编辑:程序博客网 时间:2024/06/09 19:47

EliasDelta Coding

适用范围:

EliasDeltaCoding和EliasGamma Coding一样,也是一种对正整数进行编码的统一编码,由PeterElias发明。适用于预先无法获知最大编码整数的情况,而且小整数出现频率高,大整数出现频率低。

 

编码原理

对任何正整数NUM,对INT(Log2(NUM))+1进行Gamma编码,后缀上NUM二进制串除去最高位的子串。如5的编码为011,01

 

编码示例:

NUM

EliasDelta Code

Implied probability

1 = 20 + 0

1

1/2

2 = 21 + 0

0100

1/16

3 = 21 + 1

0101

1/16

4 = 22 + 0

01100

1/32

5 = 22 + 1

01101

1/32

6 = 22 + 2

01110

1/32

7 = 22 + 3

01111

1/32

8 = 23 + 0

00100000

1/256

9 = 23 + 1

00100001

1/256


编码、解码算法:

/****************************************************Encode_EliasDelta:Encoding algorithm of EliasDelta Coding.*****************************************************/int Encode_EliasDelta(int *pSourceData,char *pEncodedData,int nSourceDataLen,int &nEncodedDataLen){int k=-1; for(int i=0;i<nSourceDataLen;i++) {        int num = pSourceData[i];        int numPow= int(log10(num)/log10(2));int num1 = numPow+1;int num1Pow= int(log10(num1)/log10(2));for (int j=0; j <num1Pow ; j++)     pEncodedData[++k]=0;pEncodedData[++k]=1;                     for (j=num1Pow-1; j >= 0; j--)              {            if (num1 & 1 << j)   pEncodedData[++k]=1;            else                 pEncodedData[++k]=0;}        for (j=numPow-1; j >= 0; j--)              {            if (num & 1 << j)    pEncodedData[++k]=1;            else                 pEncodedData[++k]=0;        }nEncodedDataLen=k+1;}return 1;}/****************************************************Decode_EliasDelta:Decoding algorithm of EliasDelta Coding.*****************************************************/int Decode_EliasDelta(int *pDecodedData,char *pEncodedData,int &nDecodedDataLen,int nEncodedDataLen){int i=0,j=0;while (1)    {//Decode num1        int num1Pow = 0;        while (!pEncodedData[i++])   num1Pow++; if(num1Pow >=48)          break;      int num1 = 0;        for (int h=num1Pow-1; h >= 0; h--)if (pEncodedData[i++])    num1 |= 1 << h;        num1 |= 1 << num1Pow; //Decode numint numPow = 0;numPow = num1-1;int num =0;for( h=numPow-1;h>=0;h--){if(pEncodedData[i++])num |= 1 <<h;}num |= 1 << numPow;        pDecodedData[j++]=num;    }    nDecodedDataLen=j;return 1;}


原创粉丝点击