Komprimierungsalgorithmen nur für Zahlen

8

Ich soll Standortdaten komprimieren (Breite, Länge, Datum, Zeit). Alle Nummern haben ein festes Format. 2 von ihnen (Breite, Länge) sind mit Dezimalformat. Andere 2 sind Ganzzahlen.

Jetzt sind diese Zahlen in fester Formatzeichenfolge.

Was sind die Algorithmen zum Komprimieren von Zahlen im festen Format? Ist die Anzahl der Komprimierungen (falls vorhanden) besser als die Zeichenfolgenkomprimierung? Soll ich String direkt komprimieren, ohne ihn in Zahlen umzuwandeln und dann zu komprimieren?

Vielen Dank im Voraus.

    
fireball003 18.05.2009, 18:16
quelle

4 Antworten

7

Dies ist einer dieser Orte, wo eine kleine Theorie hilfreich ist. Sie müssen über verschiedene Dinge nachdenken:

  • Wie groß ist die Auflösung Ihrer Messungen: 0,1 ° oder 0,001 °? 1 Sekunde oder eine Mikrosekunde?
  • sind die Messungen zugeordnet und in einer gewissen Reihenfolge, oder zufällig zusammengeworfen?

Nehmen wir beispielsweise an, dass die Auflösung 0,01 ° beträgt. Sie wissen, dass Ihre Werte zwischen -180 ° und + 180 ° oder 35900 verschiedenen Werten liegen. Lg (35900) ≈ 16 also brauchst du 16 bit; 14 Bits für -90 ° - + 90 °. Wenn Sie diese Art von Wert als Gleitkomma speichern, können Sie die Daten natürlich sofort um die Hälfte komprimieren.

Ähnlich wie bei der Datumszeit, wie groß ist der Bereich; wie viele Bits müssen Sie haben?

Wenn nun die Daten in einer bestimmten Reihenfolge vorliegen (wie zum Beispiel Proben, die sequentiell an Bord eines einzigen Schiffes genommen wurden), brauchen Sie nur einen Startwert und ein Delta; das kann einen großen Unterschied ausmachen. Mit einem Schiff, das mit 30 Knoten fährt, kann sich die Position nicht mehr ändern als etwa 0,03 Grad pro Stunde oder etwa 0,0000083 Grad pro Sekunde. Diese Deltas werden sehr kleine Werte sein, so dass Sie sie in wenigen Bits speichern können.

Der Punkt ist, dass es eine Reihe von Dingen gibt, die Sie tun können, aber Sie müssen mehr über die Daten wissen als wir, um eine Empfehlung zu machen.

Update: Oh, warte, Fixpunkt Strings ?!

Okay, das ist (relativ) einfach. Zunächst einmal, ja, Sie möchten Ihre Strings in eine Binärdarstellung konvertieren. Wenn Sie nur ein Datenelement erstellen, haben Sie möglicherweise

%Vor%

, die Sie in

konvertieren könnten %Vor%

Das sind also 96 Bits, 12 Bytes im Vergleich zu 26 Bytes.

    
Charlie Martin 18.05.2009, 18:52
quelle
5

Die Komprimierung funktioniert normalerweise in einem Byte-Stream. Wenn ein Stream eine ungleichmäßige Verteilung von Bytewerten aufweist (z. B. Text oder Zahlen, die als Text gespeichert sind), kann die Komprimierungsrate höher sein, da weniger Bits zum Speichern der Bytes verwendet werden, die häufiger vorkommen (in Huffman Komprimierung).

Normalerweise werden die Daten, über die Sie sprechen, einfach als Binärzahlen gespeichert (nicht als Text), und das ist in der Regel effizient und effizient.

Ich empfehle Ihnen, sich das Buch zur Datenkomprimierung anzusehen

    
Cade Roux 18.05.2009 18:23
quelle
2

Welche Art von Daten komprimieren Sie? Wie ist es verteilt? Ist es in irgendeiner Weise bestellt? All diese Dinge können beeinflussen, wie gut es komprimiert, und vielleicht erlauben Sie, die Daten in etwas leichter komprimierbar zu konvertieren, oder einfach kleiner direkt vor dem Tor.

Die Datenkomprimierung funktioniert bei "zufälligen" Daten schlecht. Wenn Ihre Daten in einem kleineren Bereich liegen, können Sie dies möglicherweise nutzen.

In Wahrheit sollten Sie einfach versuchen, einen der üblichen Algorithmen auszuführen und zu prüfen, ob die Daten "genug komprimiert" sind. Wenn nicht, und Sie mehr über die Daten wissen, als von den Komprimierungsalgorithmen "intuitiv" wahrgenommen werden können, sollten Sie diese Informationen nutzen.

Ein Beispiel ist, dass Ihre Daten nicht nur von Lat und Long sind, sondern dass angenommen wird, dass sie "nah beieinander" sind. Dann könnten Sie wahrscheinlich einen "Ursprung" Lat und Long speichern, und der Rest kann differentiell sein. Vielleicht sind diese Unterschiede klein genug, um in ein einzelnes, vorzeichenbehaftetes Byte zu passen.

Das ist nur ein einfaches Beispiel für Dinge, die Sie mit der Kenntnis der Daten tun können, was ein generischer Algorithmus nicht herausfinden kann.

    
Will Hartung 18.05.2009 18:30
quelle
1

Es hängt davon ab, was Sie mit den Daten machen werden und wie viel Genauigkeit Sie benötigen.

Lat / long wird traditionell in Grad, Minuten und Sekunden angegeben, mit 60 Sekunden pro Minute, 60 Minuten im Grad und einem Breitengrad, der nominell 60 Seemeilen (nmi) entspricht. 1 Minute ist dann 1 nmi, und 1 Sekunde ist knapp über 100 ft.

Der Breitengrad reicht von -90 bis +90 Grad. Wenn Sie den Breitengrad als ganze Zahl angeben, erhalten Sie einen Bereich von -324000 .. + 324000 oder etwa 20 Bit. Der Längengrad geht von -180 bis +180, so dass für Längengrad auf die gleiche Weise 1 weiteres Bit erforderlich ist.

Sie können also eine vollständige lat / long-Position in 41 Bits auf +/- 50 ft darstellen.

Wenn Sie nicht so viel Präzision benötigen, können Sie natürlich Ihre Bitzahl verringern.

Beachten Sie, dass ein herkömmliches Single-Precision-32-Bit-Float etwa 24 Bit Mantisse verwendet, also sind Sie etwa +/- 6 Fuß tief, wenn Sie nur Ihren Breitengrad / Länge in Sekunden in Float konvertieren. Es ist schwer, zwei einfach präzise schwebende Geräte für diese Art von Dingen zu schlagen.

    
John R Strohm 18.05.2009 19:23
quelle

Tags und Links