Große Zahlen komprimieren

06/16/2014 18:49 supercracker13#1
Hallo Leute, ich bin gerade dabei ein kleines Programm am schreiben, das Problem ist das dabei große Zahlen anfallen und ich eine Möglichkeit suche diese zu komprimieren.
Als Ganze Zahl kann man das wahrscheinlich nicht sehen da sehr schnell Größen um die 30k Zeichen anfallen.

Kennt ihr rein zufällig eine Methode um solche Zahlen zu komprimieren, muss nicht schnell gehen sondern nur stark komprimieren.
Besonders oft kommt die Zahl 9 vor, falls das hilft.
Hier ist mal ein Ausschnitt aus einer Zahl:

In der Ganzen Zahl beträgt die 9 ca 50% und das wird in den anderen Zahlen ebenso sei, darum habe ich schon mal gedacht ob man die Ganze zahl umdreht (wusste keinen Fachausdruck xD) also eigentlich bei jeder Ziffer 10-x, also zb aus 9 wird 1.
Damit wären die Zahlen um einiges kleiner.

Nur die Frage diese zu komprimieren. Ich weis man kann es in Bytes umwandeln also zb. 122 = z und so das ganze komprimieren. Leider sind damit keine hohen Kompressionsraten möglich (soweit ich mir jetzt denken kann).

Habt ihr dazu eine kleine Anregung, wäre echt geil:D
06/16/2014 19:08 'Heaven.#2
GZIP
06/16/2014 20:28 strubelz#3
Ich hab gelesen, das bzip2 besser komprimiert, aber länger zum komprimieren braucht. Da du ja eine stärkere Kompressionsrate willst solltest du vieleichtneher bzip2 nehmen.
06/16/2014 21:59 マルコ#4
So weit ich das verstehe möchtest du die Kompression in-memory machen um die Zahl dann direkt wieder verwenden zu können? In dem Fall wäre eine Umcodierung mit Huffman sinnvoll. Dazu brauchst du einen Binary Stream, den du mit einer Lese- und Schreiblogik versiehst. Wie das ganze genau funzt, kannst du hier nachlesen. Den Code für jedes Zeichen musst du nicht jedes Mal neu berechnen, solltest es aber zumindest alle paar tausend Zeichen machen.
06/16/2014 22:38 supercracker13#5
Ok danke schonmal. Leider suche ich etwas zur dauerhaften Speicherung von Daten und nicht zur direkten wiederverwendung. Hätte ich besser dazu geschrieben.
Mit Huffman habe ich mich auch schon auseinandergesetzt nur leider basiert es darauf, das Zeichen die häufiger vorkommen kleinere Nummern bekommen und die die seltener Vorkommen größere Nummern. Leider gibt es nur einen Unterschied zu 9 und alle andere Zahlen sind ungefähr zur gleichen Zahl vorhanden. Darum glaub ich ist es nicht so effektiv wie ich es gerne hätte. (Wenn das nicht stimmt könnt ich mich gerne verbessern).
Ich versuche jetzt nochmal meinen eigenen Algorithmus zu verbessern.

Edit bitte Lesen ob das Funktioniere würde:
Angenommen ich würde mit Huffman meine Zahl encoden. Dann kommt man der minimalen Entropie ja schon mal ziemlich nah, sodass man es nicht, oder nur minimal noch komprimieren kann.
Würde ich jetzt mit einer bestimmen Funktion die Bytes erhöhen und vermindern, sodass eine neue Dateistruktur ensteht, müsste man es doch noch mal komprimieren können oder ?.
z.B Jedes 7 um 63 erhöhen, jedes 3 um 117 und jedes 13 um 19. Dann sollten doch eigentlich die Daten neue Werte erhalten, sodass man sie neu strukturieren kann. Man muss nur die Funktion wissen um das Ganze umzukehren.
Für mich hört sich das zwar logisch an, wird aber wahrscheinlich nicht wie gewollt funktionieren. Könnt ihr mir den Grund dafür sagen, falls es nicht funktionieren sollte ? (Wenn ich nicht selber drauf komme ^^)
06/17/2014 06:44 Schlüsselbein#6
Woher kommen die Zahlen? Was hast du mit den Zahlen vor?
@Deine Idee: Es geht bei der Kodierung doch darum, die Information zu behalten und die Redundanz zu entfernen. Spinn das mal weiter und du solltest wissen warum (genaueres dazu kann dir sicher einer der Infostudenten erzählen).
06/17/2014 10:43 tayfe#7
Ich studiere kein Informatik und habe auch all die anderen Alogirthem etc. noch nie gehört. Aber vllt. hilft es ja trotzdem ;)

Ich habe ganz einfach daran gedacht, die Zahlen durch Division und Wurzelziehung zu verkleinern. So kann man ja auch große Zahlen stark verkleinern. Es würde dann vermutlich wirklich etwas länger dauern mit der Kompression, aber zumindest hättest du dann kleine Zahlen, die nur noch zusammengerechnet werden müssen.

War nur mal so mein kleiner Gedanke, keine Ahnung, ob das hilft ;)
06/17/2014 11:58 supercracker13#8
Das könnte ich auch mal probieren mit bestimmten Rechenwegen die Zahlen zu verkleineren, dabei muss man nur beachten, das die Zahlen nachher einheitliche Stellenanzahlen bekommen, damit man die Daten auch wieder heraus bekommt.

@Schlüsselbein: Ich hatte das bei meinem Beispiel folgender Maßen gemeint:

PS: Habe dafür jetzt Onlinetools benutzt, also falls etwas falsch konvertiert ist wisst ihr wodran es liegt ^^
06/17/2014 19:28 Schlüsselbein#9
Du hast uns immer noch nicht verraten, was du mit den Zahlen vor hast bzw. wo sie herkommen.

Zu Hufmann: Zu deinem Beispiel oben: Schreib dir mal ein kleines Beispielprogramm dazu und denke ans decoden. Du verschiebst den Informationsgehalt nur.