Kod Golomba

Kod Golombakod binarny zmiennej długości, służący kodowaniu liczb całkowitych nieujemnych, o potencjalnie nieograniczonej wartości. Został opracowany w 1960 roku przez Solomona W. Golomba.

W kodowaniu Golomba zbiór liczb jest dzielony na rozłączne podprzedziały o długości tzn. zaś liczba jest przedstawiana za pomocą pary (numer przedziału do którego należy, odległość od jego początku). Wartość jest nazywana rzędem kodu; jeśli rząd jest potęgą dwójki, taki kod nazywany jest kodem Rice’a (od nazwiska pomysłodawcy, Roberta F. Rice’a).

Kod jest optymalny dla źródeł o geometrycznym rozkładzie prawdopodobieństwa, tzn. prawdopodobieństwo i-tej wartości wynosi (np. dla będą to ).

Kodowanie Rice’a z adaptacyjnym dobieraniem rzędu jest stosowane m.in. w algorytmie kompresji bezstratnej JPEG-LS oraz FLAC.

Kodowanie

Kodowanie liczby wymaga znalezienia dwóch wartości:

  1. przedziału do którego należy liczba:
  2. odległości od początku przedziału:

Ogólnie

Słowo kodowe składa się z dwóch części:

  1. liczby zapisanej w kodzie unarnym,
  2. liczby zapisanej w kodzie binarnym (o prawie stałej długości, patrz następna sekcja).

Słowa kodowe nie są krótsze niż

Dla kodów rzędu kod Golomba redukuje się do kodów unarnych, nie pojawia się zakodowane

W przypadku kodów Rice’a ( jest potęgą dwójki) kodowanie jest uproszczone, ponieważ większość działań realizowana jest za pomocą szybkich operacji bitowych (koniunkcja, przesunięcie bitowe): wartość jest zapisana na pewnej liczbie młodszych bitów, na starszych.

Kod binarny o prawie stałej długości

Jeśli liczba wartości jest potęgą dwójki wówczas kod binarny ma stałą długość – składa się z bitów; niech oznacza -bitowy zapis wartości

Gdy liczba kodowanych wartości nie jest potęgą dwójki, można skonstruować kod prefiksowy, w którym początkowych wartości zostanie zapisanych na bitach, a pozostałe bitach.

Kodowanie rozpoczyna się od określenia wartości granicznej

  • jeśli liczba otrzymuje kod -bitowy –
  • jeśli liczba otrzymuje kod -bitowy liczby o większej –
liczba kod
000
101
210
3110
4111

Np. przy kodowaniu pięciu symboli i liczba Zatem trzy pierwsze liczby ( i ) otrzymają kody bitowe dla swoich wartości:

Natomiast pozostałe ( ) otrzymają kody bitowe dla liczb o większych:


Przykład kodowania

Liczba 27 zostanie zakodowana w kodzie Golomba rzędu

  1. przedział:
  2. odległość od początku przedziału:

Liczba zakodowana unarnie ma postać (6 bitów), natomiast przedział to (2 bity, kod wyznaczony we wcześniejszym przykładzie). Ostatecznie słowo kodowe jest złożeniem obu kodów:

Tabela liczb od 0 do 16 dla kodów różnego rzędu

 
00 00 0 00 00 000 0 000 00 0000
110 01 0 100 01 001 0 010 010 0001
2110 100 0 110 10 010 0 1000 011 0010
31110 101 10 00 11 0110 0 1010 100 0011
411110 1100 10 1010 00 0111 0 1100 101 0100
5111110 1101 10 1110 01 1000 0 1110 110 0101
61111110 11100 110 010 10 1001 10 000 111 0110
711111110 11101 110 1010 11 1010 10 0110 00 0111
8111111110 111100 110 11110 00 10110 10 10010 010 10000
91111111110 111101 1110 0110 01 10111 10 10110 011 10001
1011111111110 1111100 1110 10110 10 11000 10 11010 100 10010
11111111111110 1111101 1110 11110 11 11001 10 11110 101 10011
121111111111110 11111100 11110 01110 00 11010 110 0010 110 10100
1311111111111110 11111101 11110 101110 01 110110 110 0110 111 10101
14111111111111110 111111100 11110 111110 10 110111 110 100110 00 10110
151111111111111110 111111101 111110 01110 11 111000 110 101110 010 10111
1611111111111111110 1111111100 111110 1011110 00 111001 110 110110 011 110000

Bibliografia

  • Artur Przelaskowski: Kompresja danych: podstawy, metody bezstratne, kodery obrazów. Warszawa: BTC, 2005, s. 95, 97, 101. ISBN 83-60233-05-5.