Gamma编码及Delta编码概述

一、Elias Gamma Coding

即Gamma编码,是一种对正整数进行编码的统一编码,由Peter Elias发明。适用于预先无法获知最大编码整数的情况,而且小整数出现频率高,大整数出现频率低的情况。

 

编码原理:

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

编码思路:

对于任意的自然数xN={1,2,3,...},它的二进制需要floor(log(x))+1 bits来表示。在其二进制表示的前面加上floor(log(x))0,即Elias Gamma Code

例如:13d = 1011b        所以,EGC(13d) = 000 1011b

解码:

首先计算出Elias Gamma Code的开始的0的个数n

if(n == 0)

解码结果为1;

else

{

读入剩下的n+1bits;

解码结果为这些bits10进制表示;

}

编码示例:

NUM

EliasGamma Code

Implied probability

1 = 20 + 0

1

1/2

2 = 21 + 0

010

1/8

3 = 21 + 1

011

1/8

4 = 22 + 0

00100

1/32

5 = 22 + 1

00101

1/32

6 = 22 + 2

00110

1/32

7 = 22 + 3

00111

1/32

8 = 23 + 0

0001000

1/128

9 = 23 + 1

0001001

1/128

 

编码、解码算法:

 1 /**************************************************** 
 2 Encode_EliasGamma: 
 3 Encoding algorithm of EliasGamma Coding. 
 4 *****************************************************/  
 5 int Encode_EliasGamma(int *pSourceData,char *pEncodedData,int nSourceDataLen,int &nEncodedDataLen)  
 6 {  
 7     //Encoding EliasGamma Coding.         
 8     int k=-1;   
 9     for(int i=0;i<nSourceDataLen;i++)   
10     {  
11         int num =  pSourceData[i];       
12         int numPow = int(log10(num + 0.0)/log10(2+ 0.0));  
13         int j = 0;  
14         for ( j=0; j < numPow; j++)  pEncodedData[++k]=0;          
15         pEncodedData[++k]=1;  
16         for (j=numPow-1; j >= 0; j--)        
17         {  
18             if (num & 1 << j)  pEncodedData[++k]=1;    
19             else               pEncodedData[++k]=0;    
20         }     
21         nEncodedDataLen=k+1;  
22           
23     }  
24     //End of Encoding.  
25     return 1;  
26 }  
27   
28   
29 /**************************************************** 
30 Decode_EliasGamma: 
31 Decoding algorithm of EliasGamma Coding. 
32 *****************************************************/  
33 int Decode_EliasGamma(int *pDecodedData,char *pEncodedData,int &nDecodedDataLen,int nEncodedDataLen)  
34 {  
35     int i=0,j=0;  
36     while (1)  
37     {  
38         int numPow = 0;  
39         while (!pEncodedData[i++])   numPow++;            
40         if(numPow >=48)      break;              
41         int num = 0;  
42         for (int h=numPow-1; h >= 0; h--)      
43             if (pEncodedData[i++])  num |= 1 << h;        
44         num |= 1 << numPow;   
45         pDecodedData[j++]=num;        
46     }  
47     nDecodedDataLen=j;  
48       
49     return 1;  
50 }  
View Code

 

二、Elisa Delta Code

编码:

对于任意的xN = {1,2,3,...},分步介绍它的编码方式:

1)用Elisa Gamma Code的方式编码x的长度:

Cr (floor(log(x)) + 1);

2)求出x的二进制表示,并且用Cr做前缀

3)去掉x二进制表示中的第一个1

for example:

x = 13d = 1101b;

log(x) = log(13) = 3;

Cr(log(x)+1) = Cr(4) = 00100b;

EDC(x) = 00100 101b;

解码:

1)首先计算EDC中前缀0的个数n

2)读出n+1bits,即m = log(x) + 1的二进制表示

3)读出剩余的(m-1)bits,并且在前面加1,即最终的解码结果

for example:

EDC(x) = 00100 101b

n = 2;

m = n+1bits:100b = 4d

(m-1)bits:101b

1101b = 13d

 

效率:对特别大的整型范围NEDC的长度接近熵,是近似最优的,但是在小N的时候,EGC要好一些。

 

posted on 2018-03-19 20:09  海风吹  阅读(4063)  评论(0编辑  收藏  举报

导航