Golomb coding主要針對整數進行編碼,其基本思想是對較小的數用較短的編碼,對於較大的數使用較長的編碼。即,達到這樣一個效果,假設X爲要進行編碼的整數,當X趨於較小的取值時,此時的Golomb編碼較短。這樣可以有效的節省空間。
Golomb coding應用的範圍主要是整數,尤其是小整數比較多的情況。
Golomb coding使用一個可調的參數M,將輸入的值分爲兩部分:
q:被M除的結果
r:餘數
商使用一元編碼(unary coding),商後面緊跟着餘數,餘數使用截短的二進制編碼。當M=1時,Golomb coding等價於一元編碼(unary coding)。
假設對正整數X進行Golomb編碼,選擇參數m,令
b = 2m
q = INT((X-1)/b)
r = X - qb - 1
這樣,X可以被編碼爲兩部分:
第一部分是有q個1加上1個0組成
第二部分爲m位二進制數,其值爲r(r一定小於2m)
實例-1:m = 0
此時b = 20 = 1
x = 1
q = INT((x-1)/b) = INT((1-1)/1) = 0
r = x - qb - 1 = 1 - 0*1 -1 = 0
則x編碼爲q = 0個1,加上1個0,加上m = 0位二進制數r = 0,爲:
0
x = 2
q = INT((x-1)/b) = INT((2-1)/1) = 1
r = x - qb - 1 = 2 - 1*1 -1 = 0
則x編碼爲q = 1個1,加上1個0,加上m = 0位二進制數r = 0,爲:
10
x = 3
q = INT((x-1)/b) = INT((3-1)/1) = 2
r = x - qb - 1 = 3 - 2*1 -1 = 0
則x編碼爲q = 2個1,加上1個0,加上m = 0位二進制數r = 0,爲:
110
……
x = 9
q = INT((x-1)/b) = INT((9-1)/1) = 8
r = x - qb - 1 = 9 - 8*1 -1 = 0
則x編碼爲q = 8個1,加上1個0,加上m = 0位二進制數r = 0,爲:
111111110
上面的編碼彙總成表格,爲:
值x |
m = 0 |
1 |
0 |
2 |
10 |
3 |
110 |
4 |
1110 |
5 |
11110 |
6 |
111110 |
7 |
1111110 |
8 |
11111110 |
9 |
111111110 |
實例-2:m = 1
此時b = 21 = 2
x = 1
q = INT((x-1)/b) = INT((1-1)/2) = 0
r = x - qb - 1 = 1 - 0*2 -1 = 0
則x編碼爲q = 0個1,加上1個0,加上m = 1位二進制數r = 0,爲:
0 0
x = 2
q = INT((x-1)/b) = INT((2-1)/2) = 0
r = x - qb - 1 = 2 - 0*2 -1 = 1
則x編碼爲q = 0個1,加上1個0,加上m = 1位二進制數r = 1,爲:
0 1
x = 3
q = INT((x-1)/b) = INT((3-1)/2) = 1
r = x - qb - 1 = 3 - 1*2 -1 = 0
則x編碼爲q = 1個1,加上1個0,加上m = 1位二進制數r = 0,爲:
10 0
……
x = 9
q = INT((x-1)/b) = INT((9-1)/2) = 4
r = x - qb - 1 = 9 - 4*2 -1 = 0
則x編碼爲q = 4個1,加上1個0,加上m = 1位二進制數r = 0,爲:
11110 0
上面的編碼彙總成表格:
值x |
m = 1 |
1 |
0 0 |
2 |
0 1 |
3 |
10 0 |
4 |
10 1 |
5 |
110 0 |
6 |
110 1 |
7 |
1110 0 |
8 |
1110 1 |
9 |
11110 0 |
實例-2:m = 2
此時b = 22 = 4
x = 1
q = INT((x-1)/b) = INT((1-1)/4) = 0
r = x - qb - 1 = 1 - 0*4 -1 = 0
則x編碼爲q = 0個1,加上1個0,加上m = 2位二進制數r = 0,爲:
0 00
x = 2
q = INT((x-1)/b) = INT((2-1)/4) = 0
r = x - qb - 1 = 2 - 0*4 -1 = 1
則x編碼爲q = 0個1,加上1個0,加上m = 2位二進制數r = 1,爲:
0 01
x = 3
q = INT((x-1)/b) = INT((3-1)/4) = 0
r = x - qb - 1 = 3 - 0*4 -1 = 2
則x編碼爲q = 0個1,加上1個0,加上m = 2位二進制數r = 2,爲:
0 10
……
x = 9
q = INT((x-1)/b) = INT((9-1)/4) = 2
r = x - qb - 1 = 9 - 2*4 -1 = 0
則x編碼爲q = 2個1,加上1個0,加上m = 2位二進制數r = 0,爲:
110 00
上面的編碼彙總成表格:
值x |
m = 2 |
1 |
0 00 |
2 |
0 01 |
3 |
0 10 |
4 |
0 11 |
5 |
10 00 |
6 |
10 01 |
7 |
10 10 |
8 |
10 11 |
9 |
110 00 |
實例-2:m = 3
此時b = 23 = 8
x = 1
q = INT((x-1)/b) = INT((1-1)/8) = 0
r = x - qb - 1 = 1 - 0*8 -1 = 0
則x編碼爲q = 0個1,加上1個0,加上m = 3位二進制數r = 0,爲:
0 000
x = 2
q = INT((x-1)/b) = INT((2-1)/8) = 0
r = x - qb - 1 = 2 - 0*8 -1 = 1
則x編碼爲q = 0個1,加上1個0,加上m = 3位二進制數r = 1,爲:
0 001
x = 3
q = INT((x-1)/b) = INT((3-1)/8) = 0
r = x - qb - 1 = 3 - 0*8 -1 = 2
則x編碼爲q = 0個1,加上1個0,加上m = 3位二進制數r = 2,爲:
0 010
……
x = 9
q = INT((x-1)/b) = INT((9-1)/8) = 1
r = x - qb - 1 = 9 - 1*8 -1 = 0
則x編碼爲q = 1個1,加上1個0,加上m = 3位二進制數r = 0,爲:
10 000
上面的編碼彙總成表格:
值x |
m = 3 |
1 |
0 000 |
2 |
0 001 |
3 |
0 010 |
4 |
0 011 |
5 |
0 000 |
6 |
0 001 |
7 |
0 010 |
8 |
0 011 |
9 |
10 000 |
譯碼方法
以m = 2中的110 00爲例:
開始時,遇到1便讀入,知道遇到一個0,並記錄讀入1的個數。對於110 00而言,開始讀入2個1和1個0,則q = 2。隨後讀入m = 2爲的數據,作爲r,r = (00)2 = 0。之後即可計算出x = r + qb + 1 = 0 + 2*22 +1 = 8 + 1 = 9。