Frage

I 64-Bit-Werte, die ich durch Ausnutzen der Tatsache komprimieren mag, dass nur ein Teil irgendwo in der Mitte Daten enthält, und vor und nach den Nullen sind.

Sagen Sie den eigentlichen Daten L Bits lang und aufgefüllt mit n 0s vor und m 0s am Ende, so dass n + l + m = 64. Anstelle des Sendens / Speichern 64 Bits, I kann L Bits übertragen und, was ich muß die Position der Daten in dem 64-Bit-Intervall codieren.

Zum Beispiel, sagen, dass ich die Speicherung l, m und die Datenbits, dann würde ich das ursprüngliche 64-Bit-Muster wieder herstellen, indem l Lesen, Lesen l Datenbits, m zu lesen und die Daten m Bits nach links verschoben wird.

Der kleinste Kopf I kommen konnte mit zwei mal 6 Bits zum Speicher von entweder zwei von l, n und m (jeweils zwischen 0 und 64 sein). Ist es möglich, diese Zahl zu reduzieren?

War es hilfreich?

Lösung

l kann von 0 bis 64 sein, so l nicht senden, senden n und m, da sie beide Null sein können, und müssen nicht auf 64 gehen (sie einfach in der Lage sein muß, um hinzuzufügen, 64).

Die l Bits mit einer 1 beginnen und enden muss, also müssen sie nicht übertragen werden.

Bitte senden Sie 6 Bits für n
Bitte senden Sie bis zu 6 Bits für m (siehe unten)
berechnen l = 64 - (n + m)
wenn l = 0, die Zahl 0, nichts anderes
schicken wenn l = 1, die Nummer 1 * 2 ^ m, nichts anderes
schicken wenn l = 2, die Zahl 3 * 2 ^ m, nichts anderes
schicken Bitte senden Sie die Mitte l - 2 Bits.

Maximum Overhead = 10 Bits.

Die Verringerung der Bits für m ist, weil
wenn n> 32, dann wissen Sie m <32, so braucht nur 5 Bits
wenn n> 48, dann wissen Sie m <16, so braucht nur 4 Bits
wenn n> 56, dann wissen Sie m <8, so braucht nur 3 Bits
wenn n> 60, dann wissen Sie m <4, so braucht nur 2 Bits
wenn n = 63, dann wissen Sie m <2, so braucht nur 1 Bit

Andere Tipps

Ihre Analyse klingt richtig für einzelne vlaues. Aber wenn Sie viele solche Werte zusammen, eine generische Entropiecodierung Algorithmus wie gzip übertragen wird wahrscheinlich besser machen, da es ganz gut die Saiten von Nullen zu beseitigen und auch ausnutzen Redundanzen in den Daten.

Wie Sie das Problem festgestellt haben, keine kann man nicht besser machen, dass die Lösung, die Sie vorgeschlagen haben.

Wenn jedoch die Verteilung der Nullen in den Zahlen verzerrt ist, können Sie möglicherweise eine bessere Kompression im Durchschnitt zu erhalten, indem Huffman-Codes oder eine ähnliche Technik unter Verwendung der Zählungen zu repräsentieren. Eine weitere Möglichkeit ist Delta-Codierung zu verwenden, wenn die Null-Verteilung stark von einem 64-Bit-Wert zum nächsten korreliert ist.

In jedem Fall benötigen Sie eine variable Anzahl von Bits verwenden, um die Anzahl der Nullen darstellen. Und wenn Ihre Annahmen über skewedness oder Korrelation entpuppen falsch sein, können Sie mehr Bits mit im Durchschnitt am Ende, als wenn Sie es die einfache Art und Weise getan hatten.

Ihre Lösung scheint ziemlich gut.
Huffman-Kodierung ist ein weiterer Weg, um Ihre Werte zu komprimieren, vor allem wenn es Werte mit großer Häufigkeit.

Es ist nicht sehr schwierig, es zu implementieren, aber es könnte überwältigend sein, wenn Sie nicht viele Daten zu übertragen haben.

Es gibt mögliche Startpositionen 64 die Folge von Einsen n und der Länge der Sequenz l kann nicht mehr sein, dann 64 - n. So gibt es eine

r = sum(n = 0..63, 64 - n) + 1

Sequenzen insgesamt. Die zugegebene ist für eine Folge von Nullen. Doing einige Mathematik ergibt folgendes.

r = 64 * 64 - (63 * 64) / 2 + 1
  = 2081

Darstellen 2081 mögliche Werte erfordert log2(2081) = 11.023 Bits. Ihr Vorschlag, die Informationen unter Verwendung von zwei 6 Bit-Zahlen zu codieren, erfordern 12 Bits insgesamt somit optimal ist (unter der Annahme gleicher Verteilung aller möglichen Werte).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top