Stringkompression

Diskutiere Stringkompression im Plauderecke Forum; @DerWissende verschone uns doch bitte mit deinem Klugscheiss. Mag sein, dass man drei Ziffern in ein Byte quetschen kann; der VM wirst du das in...

  1. Tobse
    Tobse Bekanntes Mitglied
    @DerWissende verschone uns doch bitte mit deinem Klugscheiss.
    Mag sein, dass man drei Ziffern in ein Byte quetschen kann; der VM wirst du das in Verbindung mit dem Datentyp char aber nicht beibringen können; schließlich könnte man später ja auch ein Zeichen durch ein 'Ä' ersetzen. Die VM nutzt 16 bit (= 2 Byte) pro char und fertig. Deine Klugscheißerei bringt garnichts; sie verbreitet Fehlinformationen und Verwirrung.
     
    tommysenf gefällt das.
  2. mrBrown
    mrBrown Bekanntes Mitglied
    Ein char pro Zeichen gilt allerdings nur bis inklusive Java 8 ;)

    Mir bereitet sie viel Amüsement :p
     
  3. DerWissende
    DerWissende Bekanntes Mitglied
    Schade, das @Tobse noch nie etwas von Bitsets gehört haben scheint - und das ist keine Fehlinformation (und Klugscheißerei) meinerseits - das Unwissenheit von @Tobse und anderen...

    Aber bitte dann schlagt halt jemanden der es besser weiß. ;)
     
  4. Tobse
    Tobse Bekanntes Mitglied
    Wenn Oracle es dann mal geschafft hat, Java 9 fertigzustellen und das erste stable JDK zu veröffentlichen, können wir darüber nochmal diskutieren.

    Mir ist durchaus bewusst und vollkommen klar, wie die Information für drei dezimale Ziffern in ein Byte passen. Dass die JVM diese Technik in der Klasse String oder in char[] einsetzt muss man mir aber erst mal beweisen - ich würde einiges Wetten, dass sie das nicht tut.

    Angenommen, die JVM würde diese Speicherplatzoptimierung machen. Dann erkläre mir mal, wie die JVM diesen Code richtig ausführen könnte:

    Code (Java):
    char[] tausend0en = generiereEinCharArrayMitTausendNullen();
    char meinChar = char[2];
    tausend0en[40] = '\uf301';
     
    Ich meine: garnicht; bei der abartigen Informationsdichte von 3 dezimalen Ziffern / Byte ist kein Platz mehr für die Information, welche Bytes jetzt so komprimiert sind und welche nicht.
     
  5. Joose
    Joose Super-Moderator Mitarbeiter
    Doch hast wenn ma es genau nimmt ;)
    999 hat drei Ziffern und sollte laut dieser Aussage in ein Byte passen.
     
  6. JStein52
    JStein52 Bekanntes Mitglied
    Na ja, ihr wisst doch dass er von der 1 mit besagter Zahl 0en geredet hat.
     
  7. Harry Kane
    Harry Kane Bekanntes Mitglied
    Kann mir das mal jemand erklären? Pro Dezimalzahl braucht man doch 4 bits?
     
  8. Joose
    Joose Super-Moderator Mitarbeiter
    Ich meinte ja "wenn man es genau nimmt" ;) ... drei Ziffern können 100 oder aber auch 999 sein ... natürlich ging es in diesem um die Ziffern 1 und 0, trotzdem war das nicht mein erster Gedanke sondern eben beliebige drei Ziffern.
     
  9. Tobse
    Tobse Bekanntes Mitglied
    In ein einziges Byte bekommst du sie nicht rein. Aber wenn du genug Bytes nimmst, schaffst du es im Schnitt auf c.a. 3 pro Byte; 4 bits können schließlich Zahlen von 0 bis 15 darstellen. Mathematisch gesagt:

    n Ziffern der Basis b können z(b, n) = b^n - 1 Zustände annehmen. Damit gilt auch n(b, z) ~= log(z)/log(b). Sei b0 = 2 und b1 = 10. Gesucht ist das Verhältnis r von n(b1, z) zu n(b0, z) für beliebige z.

    (log(z)/log(b1))/(log(z)/log(b0)) = log(b1)/log(b0) = log(10)/log(2) = 3,3219280948873623478703194294894
     
  10. mrBrown
    mrBrown Bekanntes Mitglied
    Für n Ziffern aus 1 oder 0 reichen dann aber auch einfach n Bits ;)
    (Oder sogar 1 Bit, '1' ist eine 1 mit besagter Zahl Nullen, '0' ist sie nicht :p )
     
Thema: Stringkompression