Gamma編碼及Delta編碼概述

1、Elias Gamma Coding算法

即Gamma編碼,是一種對正整數進行編碼的統一編碼,由Peter Elias發明。適用於預先沒法獲知最大編碼整數的狀況,並且小整數出現頻率高,大整數出現頻率低的狀況。ide

 

編碼原理:編碼

對任何正整數NUM,對INT(Log2(NUM))+1進行一元編碼,後綴上NUM二進制串除去最高位的子串。如5的編碼爲001,01。spa

編碼思路:3d

對於任意的天然數xN={1,2,3,...},它的二進制須要floor(log(x))+1 bits來表示。在其二進制表示的前面加上floor(log(x))0,即Elias Gamma Codecode

例如:13d = 1011b        因此,EGC(13d) = 000 1011bblog

解碼:it

首先計算出Elias Gamma Code的開始的0的個數nevent

if(n == 0)table

解碼結果爲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

 

2、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要好一些。

相關文章
相關標籤/搜索