Der Golomb Code ist eine Darstellungsform für alle positiven ganzen Zahlen, im Gegensatz zu anderen Codes, die nur einen begrenzten Bereich (z. B. 0-255) darstellen können. Er wurde 1966 von Solomon W. Golomb vorgestellt.
Der Code verwendet wenige Bits für kleine und viele Bits für größere Zahlen. Dabei kann er über einen Parameter gesteuert werden. Je größer der Parameter, um so langsamer wächst die Anzahl der zur Darstellung benötigten Bits, aber um so größer ist die Anzahl der minimal benötigten Bits für die kleinen Zahlen.
Aufgrund dieser Eigenschaften kann der Code für Entropiekodierungen verwendet werden, bei denen die Wahrscheinlichkeiten der zu kodierenden Zeichen (näherungsweise) eine geometrische Reihe bilden.
Arbeitsweise
Der Code arbeitet mit der Idee die darzustellende Zahl durch einen Quotienten und den Rest bei einer Division mit einem Parameter zu ersetzen.
Mit den in diesem Artikel vorgestellten Formeln ist es nicht möglich die 0 darzustellen. Um das zu ermöglichen muss der zu kodierende Wert um 1 erhöht, oder die Subtraktion der 1 aus den Formeln entfernt werden.
Die Zahl , mit wird durch
und
beschrieben. Zur besseren Beschreibung wird noch die Zahl
benötigt.
Der Quotient wird dann unär ausgegeben, d. h. es werden "1" Bits gefolgt von einer "0" abgelegt.
Die Darstellung des Restes wird in vielen Quellen falsch angegeben als:
- Der Rest wird auf eine spezielle Weise abgelegt. Die ersten Werte werden mit Bits gespeichert. Wobei das höchstwertige Bit 0 ist. Die anderen Werte werden in Bits abgelegt, wobei das höchstwertige Bit gesetzt ist.
Diese Art der Ablegung funktioniert nicht. Das kann man sich einfach an einem Beispiel mit dem Parameter 7 überlegen. ist in diesem Fall 2. Das würde bedeuten, dass die ersten 2 Werte für den Rest als '00' und '01' abgelegt werden. Dann stehen noch 4 weitere Kodierungen mit je 3 Bits zur Verfügung '100', '101', '110', '111'. Es stehen somit 6 verschiedene Kodes zur Verfügung. Es werden aber Kodes für insgesamt 7 verschiedene Werte benötigt. Die Anzahl der Kodierungen reicht also nicht aus. In anderen Fällen, z. B. verschwendet diese Darstellung Bits, da mögliche Bitfolgen ungenutzt bleiben würden.
Richtigerweise muss der Rest in einer "abgeschnittenen binären Darstellung" (en:Truncated_binary_encoding) genannten Codierung abgelegt werden. Diese Darstellung legt einen Teil der Werte, falls möglich, mit und den anderen Teil, mit Bit ab. Die Anzahl der Werte, die mit Bits abgelegt werden kann ist
Beispiele
Die Darstellung der Zahl 10 mit einem Parameter 4:
Daraus resultiert die Bitfolge "110 01". Das Leerzeichen zeigt den Übergang vom Quotienten zum Rest.
Ein paar weitere Beispiele:
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
b=3 | 0 0 | 0 10 | 0 11 | 10 0 | 10 10 | 10 11 | 110 0 | 110 10 | 110 11 | 1110 0 |
b=4 | 0 00 | 0 01 | 0 10 | 0 11 | 10 00 | 10 01 | 10 10 | 10 11 | 110 00 | 110 01 |
b=5 | 0 00 | 0 01 | 0 10 | 0 110 | 0 111 | 10 00 | 10 01 | 10 10 | 10 110 | 10 111 |
b=7 | 0 00 | 0 010 | 0 011 | 0 100 | 0 101 | 0 110 | 0 111 | 10 00 | 10 010 | 10 011 |
Anwendung
Der Golomb Code kann angewendet werden, wenn Zahlen unbekannter Größe abspeichert werden sollen.
Das eigentliche Anwendungsgebiet liegt in der Datenkompression. Wenn die Wahrscheinlichkeiten der Zahlen eine bestimme Verteilung (Exponentielle Verteilung) aufweisen, dann kann der Golomb Code genau so effizient wie der Huffman-Code sein, ist dabei aber sparsamer mit Speicher, leichter zu implementieren und schneller in der Ausführung.
Rice Code
Der Rice Code ist eine Variante des Golomb Codes bei dem der Parameter eine Potenz von 2 ist. Diese Codes lassen sich sehr einfach mit Bitshiften und logischen Bitoperationen umsetzen.
Angenommen es gilt . Dann ist
und
steht dabei für bitweises verschieben nach rechts und für bitweise Und-Verknüpfung.
r wird dabei immer mit genau Bits dargestellt.
Literatur
Golomb S. W. Run Length Encodings, IEEE Transactions on Information Theory IT-12(3):399-401
Kommentare
Wie geht das? Nun, es gibt da keine offensichtliche, im Sinne einer einzig richtigen formulierbaren Antwort, gewissermaßen eines non plus ultra. Wir hoffen, trotzdem geholfen zu haben. CSS zocken macht eh mehr fun Frage ich differenzierter: Wie kann ich die Zahl 12 im Golomb Code kodieren? Versuchs mal bei der 11833.