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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM