1、Elias Gamma Coding算法
即Gamma編碼,是一種對正整數進行編碼的統一編碼,由Peter Elias發明。適用於預先沒法獲知最大編碼整數的狀況,並且小整數出現頻率高,大整數出現頻率低的狀況。ide
編碼原理:編碼
對任何正整數NUM,對INT(Log2(NUM))+1進行一元編碼,後綴上NUM二進制串除去最高位的子串。如5的編碼爲001,01。spa
編碼思路:3d
對於任意的天然數x∈N={1,2,3,...},它的二進制須要floor(log(x))+1 bits來表示。在其二進制表示的前面加上floor(log(x))個0,即Elias Gamma Code。code
例如:13d = 1011b 因此,EGC(13d) = 000 1011bblog
解碼:it
首先計算出Elias Gamma Code的開始的0的個數n。event
if(n == 0)table
解碼結果爲1;
else
{
讀入剩下的n+1個bits;
解碼結果爲這些bits的10進製表示;
}
編碼示例:
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 }
2、Elisa Delta Code
編碼:
對於任意的x∈N = {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+1個bits,即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
效率:對特別大的整型範圍N,EDC的長度接近熵,是近似最優的,可是在小N的時候,EGC要好一些。