Effizienteste Weg 2 Positionen zwischen 0 und 64 zu codieren?
-
07-07-2019 - |
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?
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).