Ich habe gerade angefangen, ein Buch mit dem Titel Einführung in die Datenkomprimierung von Guy E. Blelloch zu lesen. Auf Seite eins sagt er:
Die Wahrheit ist, dass, wenn eine Nachricht durch einen Algorithmus verkürzt wird, eine andere Nachricht verlängert werden muss. Sie können dies in der Praxis überprüfen, indem Sie GZIP für eine GIF-Datei ausführen. Es ist in der Tat möglich, weiter zu gehen und zu zeigen, dass für eine Reihe von Eingabenachrichten fester Länge, wenn eine Nachricht komprimiert wird, die durchschnittliche Länge der komprimierten Nachrichten über alle möglichen Eingaben immer länger als das Original sein wird Eingabenachrichten.
Betrachten Sie zum Beispiel die 8 möglichen 3-Bit-Nachrichten. Wenn eine auf zwei Bits komprimiert ist, ist es nicht schwer, sich davon zu überzeugen, dass zwei Nachrichten auf 4 Bits erweitert werden müssen, was einem Durchschnitt von 3 1/8 Bits entspricht.
"Ja wirklich?" Es fällt mir sehr schwer, mich davon zu überzeugen. In der Tat ist hier ein Gegenbeispiel. Betrachten Sie den Algorithmus, der eine 3-Bit-Zeichenfolge als Eingabe akzeptiert und den folgenden Ausgaben zugeordnet ist:
000 -> 0
001 -> 001
010 -> 010
011 -> 011
100 -> 100
101 -> 101
110 -> 110
111 -> 111
Da sind Sie also - kein Eingang ist einem längeren Ausgang zugeordnet. Es gibt sicherlich keine "zwei Nachrichten", die auf 4 Bit erweitert wurden.
Worüber spricht der Autor genau? Ich vermute, dass es entweder eine implizite Einschränkung gibt, die mir einfach nicht klar ist, oder dass er eine Sprache verwendet, die viel zu umfassend ist.
Haftungsausschluss: Mir ist klar, dass Sie tatsächlich Daten verlieren, wenn mein Algorithmus iterativ angewendet wird. Versuchen Sie, es zweimal auf den Eingang 110 anzuwenden: 110 -> 000 -> 0, und jetzt wissen Sie nicht, welcher von 110 und 000 der ursprüngliche Eingang war. Wenn Sie es jedoch nur einmal anwenden, erscheint es mir verlustfrei. Hat das etwas mit dem zu tun, worüber der Autor spricht?
quelle
Antworten:
Was Sie vermissen, ist, dass Sie alle Bits der Größe 3 oder weniger berücksichtigen müssen . Das heißt: Wenn in einem Komprimierungsschema für Bits der Größe 3 oder weniger eine der 3-Bit-Zeichenfolgen zu einer 2-Bit-Zeichenfolge komprimiert wird, muss eine Zeichenfolge der Größe 3 oder weniger auf 3 Bit oder mehr erweitert werden.
Ein Kompressionsschema ohne Verlust ist eine Funktion von endlichen Bitfolgen zu endlichen Bitfolgen, die injektiv ist, dh wenn C ( x ) = C ( y ), dann bestimmt x = y , dh C ( x ) bestimmt x eindeutig .C C(x)=C(y) x=y C(x) x
Betrachten Sie ein beliebiges Komprimierungsschema und lassen Sie S eine Menge von Binärzeichenfolgen sein. Wir können ausdrücken, wie gut C auf S funktioniert, indem wir das Verhältnis CompressionRatio ( C , S ) = ∑ x ∈ S l e n g t h ( C ( x ) ) berechnen.C S C S
Ein kleines Kompressionsverhältnis ist gut. Zum Beispiel, wenn es sich1/2Das bedeutetwir können im Durchschnitt Kompresse Saiten inSum 50% unter VerwendungC.
Wenn wir versuchen, alle Zeichenfolgen mit einer Länge von höchstens zu komprimieren, haben wir Probleme:n
Das beste Komprimierungsschema der Welt ist also die Identitätsfunktion! Nun, nur wenn wir zufällige Bitfolgen komprimieren wollen . Die in der Praxis vorkommenden Bitfolgen sind alles andere als zufällig und weisen viel Regelmäßigkeit auf. Aus diesem Grund ist es trotz des obigen Satzes sinnvoll, Daten zu komprimieren.
quelle
Nur eine zusätzliche Anmerkung zu Andrejs guter Antwort:
Sie können auch einen Blick auf die Komplexität von Kolmogorov werfen :
InformellC(s) s C(s)≥|s|
Zwei grundlegende Sätze sind:
1) Unabhängig vom Berechnungsmodell gibt es eine Konstante so dass für jede Zeichenfolge sc s C(s)≤|s|+c s
2) Für alle gibt es eine Zeichenfolgen s n C(s)≥|s|
quelle
Ihr Gegenbeispiel ist falsch.
Ihre Liste der komprimierten Werte enthält einige versteckte Informationen, wodurch die durchschnittliche Länge länger als 3 Bit ist. Die zusätzliche Information ist die Länge der Ausgabezeichenfolge.
Mit unseren Augen können wir aus Ihrer Tabelle ersehen, dass die erste Ausgabezeichenfolge nur 1 Bit lang ist und die anderen 3 Bit, aber Sie betrügen, wenn Sie diese Tatsache nicht explizit codieren. Codieren wir das, indem wir ein weiteres Bit voranstellen. 0 bedeutet "Länge = 1" und 1 bedeutet "Länge = 3".
So wird Ihr Tisch wirklich:
... was durchschnittlich 3,75 Bit beträgt.
BEARBEITEN
Hier ist ein nachträglicher Gedanke, der den gleichen Punkt veranschaulicht. Es ist eine schöne Quizfrage:
Morsecode besteht nur aus Punkten und Strichen. Nennen wir Punkt 0 und Bindestrich 1. Alle Großbuchstaben werden als nicht mehr als vier Bits codiert.
Es gibt 26 Großbuchstaben. Vier Bits sollten jedoch nur 16 verschiedene Werte codieren können. Was ist los?
quelle
Da solche Faktoren sehr stark von der Anwendung abhängen, ist es hilfreich, ein Berechnungsmodell anzunehmen, in dem angenommen wird, dass Eingabezeichenfolgen Informationen enthalten, die ausreichen, um den Leser wissen zu lassen, wo sie enden (selbst wenn sie mit beliebigen Mengen beliebiger Daten aufgefüllt wurden). und Ausgabezeichenfolgen sind ebenfalls erforderlich. Ein solches Berechnungsmodell ermöglicht es, dass alle Operationen, die mit einzelnen Datensätzen arbeiten würden, genauso gut mit jeder verketteten Folge von Datensätzen funktionieren [Code, der weiß, wann das Lesen ganzer unkomprimierter Datensätze beendet werden muss, kann genauso gut wissen, wann er gestoppt werden muss ganze komprimierte lesen].
quelle