„Golomb-Code“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[ungesichtete Version][ungesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
P. Birken (Diskussion | Beiträge)
Kat, Ueberarbeiten
Andreas.Roever (Diskussion | Beiträge)
Artikel erweitert
Zeile 1: Zeile 1:
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.
{{Überarbeiten}}


Der '''Golomb Code''' ist eine Darstellungsform für ''alle'' positiven ganzen Zahlen. Er wurde 1966 von [[Solomon W. Golomb]] vorgestellt. Der Code kann ü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.
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 [[Entropiekodierung|Entropiekodierungen]] verwendet werden, bei denen die Wahrscheinlichkeiten der zu kodierenden Zeichen (näherungsweise) eine [[geometrische Reihe]] bilden.


== Arbeitsweise ==
== Arbeitsweise ==


Der Code arbeitet mit der Idee die darzustellende Zahl durch einen Quotienten <math>q</math> und den Rest <math>r</math> bei einer Division mit einem Parameter <math>b</math> zu ersetzen.
Der Code arbeitet mit der Idee die darzustellende Zahl durch einen Quotienten <math>q</math> und den Rest <math>r</math> bei einer Division mit einem Parameter <math>b</math> zu ersetzen.

Mit den in diesem Artikel vorgestellten Formeln ist es nicht möglich die 0 darzustellen. Um das zu ermöglichen muß der zu kodierende Wert um 1 erhöht, oder die Subtraktion der 1 aus den Formeln entfernt werden.


Genau wird die Zahl <math>n</math> durch
Die Zahl <math>n</math>, mit <math>n > 0</math> wird durch


<math>q=\left\lfloor \frac{n-1}{b} \right\rfloor</math>
<math>q=\left\lfloor \frac{n-1}{b} \right\rfloor</math>
Zeile 21: Zeile 25:
benötigt.
benötigt.


Der Quotient wird dann unär beschrieben, d.h. es werden <math>q</math> "1" Bits abgelegt gefolgt von einer "0".
Der Quotient wird dann unär ausgegeben, d.h. es werden <math>q</math> "1" Bits gefolgt von einer "0" abgelegt.


Die Ablage des Restes wird in vielen Quellen falsch angegeben als:
Die Darstellung des Restes wird in vielen Quellen falsch angegeben als:


:Der Rest wird auf eine spezielle Weise abgelegt. Die ersten <math>c</math> Werte werden mit <math>c</math> Bits gespeichert. Wobei das höchstwertige Bit 0 ist. Die anderen Werte werden in <math>c + 1</math> Bits abgelegt, wobei das höchstwertige Bit gesetzt ist.
:Der Rest wird auf eine spezielle Weise abgelegt. Die ersten <math>c</math> Werte werden mit <math>c</math> Bits gespeichert. Wobei das höchstwertige Bit 0 ist. Die anderen Werte werden in <math>c + 1</math> 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. <math>c</math> 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. <math>b=5</math> verschwendet diese Darstellung Bits, da mögliche Bitfolgen ungenutzt bleiben würden.
Diese Art der Ablegung funktioniert nicht. Der Rest muss 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 <math>\lceil\log_2 b\rceil - 1</math> und den anderen Teil, mit <math>\lceil\log_2 b\rceil</math> Bit ab. Die Anzahl der Werte, die mit <math>\lceil\log_2 b\rceil - 1</math> Bits abgelegt werden kann ist <math>2^{\lceil\log_2 b\rceil}-b</math>

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 <math>\lceil\log_2 b\rceil - 1</math> und den anderen Teil, mit <math>\lceil\log_2 b\rceil</math> Bit ab. Die Anzahl der Werte, die mit <math>\lceil\log_2 b\rceil - 1</math> Bits abgelegt werden kann ist <math>2^{\lceil\log_2 b\rceil}-b</math>


== Beispiele ==
== Beispiele ==
Zeile 90: Zeile 96:
|10 111
|10 111
|-
|-
|b=7
|0 00
|0 010
|0 011
|0 100
|0 101
|0 110
|0 111
|10 00
|10 010
|10 011
|}
|}


Zeile 96: Zeile 113:
Der Golomb Code kann angewendet werden, wenn Zahlen unbekannter Größe abspeichert werden sollen.
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 [[Shannon-Fano-Kodierung|Huffman-Code]] sein, ist dabei aber sparsamer mit Speicher, leichter zu implementieren und schneller in der Ausführung.
Das eigentliche Anwendungsgebiet liegt in der Datenkompression. Wenn die Wahrscheinlichkeiten der Zahlen eine bestimme Verteilung ([[Exponentialverteilung|Exponentielle Verteilung]]) aufweisen, dann kann der Golomb Code genau so effizient wie der [[Shannon-Fano-Kodierung|Huffman-Code]] sein, ist dabei aber sparsamer mit Speicher, leichter zu implementieren und schneller in der Ausführung.


== Rice Code ==
== Rice Code ==


Der Rice Code ist eine Variante des Golomb Codes bei dem der Parameter <math>b</math> eine Potenz von 2 ist. Diese Codes lassen sich sehr einfach mit Bitshiften und logischen Bitoperationen umsetzen.
Der Rice Code ist eine Variante des Golomb Codes bei dem der Parameter <math>b</math> eine Potenz von 2 ist. Diese Codes lassen sich sehr einfach mit Bitshiften und logischen Bitoperationen umsetzen.

Angenommen es gilt <math>b=2^p</math>. Dann ist

<math>q = (n-1) \gg p</math>

und

<math>r = (n-1) \and (b-1)</math>

<math>\gg</math> steht dabei für bitweises verschieben nach rechts und <math>\and</math> für bitweise Und-Verknüpfung.

r wird dabei immer mit genau <math>p</math> Bits dargestellt.


== Literatur ==
== Literatur ==

Version vom 30. Oktober 2005, 12:14 Uhr

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 muß 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