2010-08-06 5 views
6

Durch Schublade Prinzip kann jeder verlustfreie Kompression Algorithmus "besiegt" werden, d. H. Für einige Eingänge erzeugt es Ausgänge, die länger als die Eingabe sind. Ist es möglich, explizit eine Datei zu konstruieren, die, wenn sie z. Gzip oder andere verlustfreie Komprimierungsprogramm, wird (viel) größere Ausgabe führen? (Oder, betters, noch eine Datei, die ad infinitum bei der nachfolgenden Kompressionen aufbläst?)Wie gzip (oder andere verlustfreie Komprimierung) zu besiegen ist

+2

Ich würde erwarten, dass die meisten Komprimierungsalgorithmen schlau genug sind, um überhaupt nicht zu komprimieren, wenn sie die Dinge verschlimmern würden. Sie könnten eine konstante Anzahl von Bytes in den Headern hinzufügen, aber eine 50% größere Datei zu erzeugen, wenn Sie nur die ursprünglichen Bytes speichern können, wäre ein ziemlich ernster Bug. –

+0

Ihr "Beweis", dass ein verlustfreies Komprimierungsschema besiegbar sein muss, hat einen kleinen Schönheitsfehler: Es gibt tatsächlich n Löcher für n Vögel. Ein "Kompressions" -System, das alle Eingaben um 0% ableitet und keine Header hinzufügt, ist nicht zu verwehren :-). – Borealid

+0

* "Datei, die zB zu gzip oder einem anderen verlustfreien Komprimierungsprogramm führt, führt zu (viel) größerem Output?" * Nun, Sie könnten 'cat/dev/urandom | gzip> ~/1.bin' auf Linux verwenden .... – SigTerm

Antwort

0

versuchen, die Datei auf gzip, die aus dem folgenden Befehl führt:

echo a > file.txt 

Die Kompression einer 2 Bytes-Datei einer Folge 31 Byte Datei gezippt!

0

Eine Textdatei mit 1 Byte (z. B. ein Zeichen wie 'A') wird in 1 Byte auf der Festplatte gespeichert, winrar rar es jedoch auf 94 Byte und Reißverschlüsse auf 141 Byte.

Ich weiß, es ist eine Art Cheat-Antwort, aber es funktioniert. Ich denke, es ist der größte Unterschied zwischen der Originalgröße und der "komprimierten" Größe, die Sie sehen werden.

Werfen Sie einen Blick auf die Formel für Zipping, sie sind relativ einfach, und um "komprimierte" Datei größer als das Original zu machen, ist die einfachste Möglichkeit, um sich wiederholende Daten zu vermeiden.

3

Zufällige Daten oder Daten, die mit einem guten cypher verschlüsselt sind, wären wahrscheinlich am besten.

Aber jeder gute Packer sollte nur konstanten Overhead hinzufügen, sobald er entscheidet, dass es die Daten nicht komprimieren kann. (@Frank). Für einen festen Overhead ergibt eine leere Datei oder ein einzelnes Zeichen den größten prozentualen Overhead.

Für Packer, der den Dateinamen (zB rar, zip, tar), man kann natürlich enthalten nur den Dateinamen machen wirklich lange :-)

+0

Auch wenn das Komprimieren nur konstanten Overhead hinzufügt, kann eine Datei auf diese Weise unbegrenzt wachsen, wenn sie auf jeder Ebene nicht komprimiert wird? (Ich weiß, das ist rein theoretisch :)) –

+1

Nr. Zufällige Daten, weil es zufällig ist, wird einige Sequenzen enthalten, die wirklich sehr gut komprimieren. – DJClayworth

+0

@DJClayworth aber zufällige Daten haben nichts von der Struktur, die Kompression erfordert, so dass der Kompressor die Codierung der Bits verlieren wird, die keine schönen Sequenzen sind. –

8

Nun, ich werde es schließlich annehmen würde max out da die Bitmuster wiederholen, aber ich habe gerade:

touch file 
gzip file -c > file.1 
... 
gzip file.9 -c > file.10 

Und bekam:

0 bytes: file 
25 bytes: file.1 
45 bytes: file.2 
73 bytes: file.3 
103 bytes: file.4 
122 bytes: file.5 
152 bytes: file.6 
175 bytes: file.7 
205 bytes: file.8 
232 bytes: file.9 
262 bytes: file.10 

Hier sind 24.380 Dateien grafisch (dies ist wirklich überraschend für mich, tatsächlich):

alt text http://research.engineering.wustl.edu/~schultzm/images/filesize.png

ich nicht diese Art von Wachstum erwartet wurde, würde ich die lineare Wachstum nur erwarten, da es sollte nur mit einem Wörterbuch, um die vorhandenen Daten in einem Header wird Einkapseln von Muster. Ich beabsichtigte, 1.000.000 Dateien zu durchsuchen, aber meinem System ging schon viel Speicherplatz aus.

Wenn Sie hier reproduzieren wollen, ist der Bash-Skript, um die Dateien zu erzeugen:

#!/bin/bash 

touch file.0 

for ((i=0; i < 20000; i++)); do 
    gzip file.$i -c > file.$(($i+1)) 
done 

wc -c file.* | awk '{print $2 "\t" $1}' | sed 's/file.//' | sort -n > filesizes.txt 

Das resultierende filesizes.txt ist eine Tab-separierte, sortierte Datei für Ihr Lieblingsgraphikprogramm. (Sie müssen das Feld "total" manuell entfernen oder es wegskriptieren.)

+0

Interessant, dass die Dateigröße scheint in keiner bestimmten Reihenfolge oder ohne besondere Beziehung –

+0

Es sieht aus wie eine reine lineare Erhöhung von Kopfzeilen/Wörterbücher usw. –

+0

@Douglas: Das war meine Erwartung, aber ich habe mit vielen aktualisiert mehr Dateien. Anscheinend kann das Aussehen täuschen. – mjschultz

0

Alle diese Komprimierungsalgorithmen suchen nach redundanten Daten. Wenn die Datei keine oder sehr wenig Redundanz enthält (wie eine Sequenz von abac…az, bcbd…bz, cdce…cz usw.)) Es ist sehr wahrscheinlich, dass die "deflationierte" Produktion eher eine Inflation ist.