Komprimieren von zwei ganzen Zahlen ohne Berücksichtigung der Reihenfolge


20

Vergleicht man ein geordnetes Paar (x, y) mit einem ungeordneten Paar {x, y} (gesetzt), so beträgt die Differenz theoretisch nur ein Bit, da es genau eines einzelnen Bits bedarf, um darzustellen, ob x zuerst kommt oder y.

Wenn wir also eine Menge {x, y} haben, in der x, y zwei verschiedene 32-Bit-Ganzzahlen sind, können wir sie dann in 63 Bits (statt 64) packen? Es sollte möglich sein, die ursprünglichen 32-Bit-Ganzzahlen aus dem 63-Bit-Ergebnis wiederherzustellen, ohne jedoch deren Reihenfolge wiederherstellen zu können.

Antworten:


27

Ja, das kann man. Wenn , ordnen Sie die Menge der Zahl zu{ x , y }x<y{x,y}

f(x,y)=y(y1)/2+x.

Es ist leicht zu zeigen, dass bijektiv ist und daher eindeutig dekodiert werden kann. Wenn , haben wir , daher wird die Menge auf eine 63-Bit-Zahl . Zum Dekodieren können Sie die binäre Suche für oder eine Quadratwurzel ziehen: sollte ungefähr .0 x < y < 2 32 0 f ( x , y ) < 2 63 - 2 31 { x , y } f ( x , y ) y y f0x<y<2320f(x,y)<263231{x,y}f(x,y)yy2f(x,y)


1
genau wie 1 + 2 + 3 + ... + y + x schön!
Troy McClure

1
Verallgemeinerung auf n ungeordnete Ints? :) Auf den zweiten Blick werden viele Quadforms mit ausreichend großen partiellen Derivaten den Job machen
Troy McClure

4
Eine andere Antwort, die wegen ihres geringen Rechenaufwands attraktiv sein kann: Wenn xund ysind verschieden, dann passt entweder x-y-1oder y-x-1( natürlich beide Mods ) in 31 Bit. Wenn ist klein, dann verketten und die letzten 31 Bits von ; ansonsten verketten und die letzten 31 Bits von . Stellen Sie die beiden Zahlen wieder her, indem Sie die ersten 32 Bits als eine Zahl nehmen und die ersten 32 Bits, die letzten 31 Bits und die Konstante 1 (mod ) als die andere hinzufügen . 2 32232x-y-1yx-y-1xy-x-1232
Daniel Wagner

1
Ihre Methode verallgemeinert auch schön, um mehr Zahlen hinzuzufügen, da die erste Zahl "nur da" ist, so kann Kette
Troy McClure

4
@DW: Könnten Sie bitte auch hinzufügen, wie Sie auf diese Darstellung gekommen sind? Ansonsten scheint es, als hättest du es aus der Luft gezogen.
Mehrdad

9

Beachten Sie als Ergänzung zu DWs Antwort, dass dies ein besonderer Fall des kombinatorischen , das eine streng abnehmende Folge von nicht-negativen ganzen Zahlen zu kompakt abbildetc k > > c 1 N = k i = 1 ( c ikck>>c1

N=i=1k(cii).

Diese Nummer hat eine einfache Interpretation. Wenn wir diese Sequenzen lexikographisch ordnen, zählt die Anzahl der kleineren Sequenzen.N

zum Dekodieren einfach den größten Wert zu, so dass und dekodieren Sie als -Sequenz.( c kckN- ( ck(ckk)N (k-1)N(ckk)(k1)


4

Die Gesamtzahl ungeordneter Zahlenpaare in einer Menge von ist . Die Gesamtzahl der ungeordneten Paare unterschiedlicher Zahlen beträgt . Es werden Bits benötigt, um ein geordnetes Zahlenpaar darzustellen. Wenn Sie ein Bit weniger haben, können Sie Elemente mit einem Leerzeichen von bis zu . Die Anzahl ungeordneter, nicht notwendigerweise unterschiedlicher Paare ist etwas mehr als die Hälfte der Anzahl geordneter Paare, sodass Sie in der Darstellung kein Bit speichern können. Die Anzahl der ungeordneten unterschiedlichen Paare ist etwas geringer als die Hälfte, sodass Sie ein wenig sparen können.NN(N+1)/2N(N1)/22log2(N)=log2(N2)N2/2

Für ein praktisches Schema, das einfach zu berechnen ist und bei dem eine Zweierpotenz ist, können Sie an der bitweisen Darstellung arbeiten. Nehmen Sie wobei der XOR-Operator (bitweise exklusiv oder) ist. Das Paar kann entweder aus oder wiederhergestellt werden . Jetzt werden wir nach einem Trick suchen, um ein Bit im zweiten Teil zu speichern und und eine symmetrische Rolle damit die Reihenfolge nicht wiederhergestellt werden kann. Angesichts der obigen Kardinalitätsberechnung wissen wir, dass dieses Schema in dem Fall, in dem nicht funktioniert .Na=xy{x,y}(a,x)(a,y)xyx=y

Wenn gibt es eine Bitposition, an der sie sich unterscheiden. Ich schreibe für das te Bit von (dh ) und ebenso für . Es sei die kleinste Bitposition, an der und unterschiedlich sind: ist das kleinste so dass . ist das kleinste so dass : wir können von erholen . Sei entweder oderxyxiixx=ixi2iykxykixiyikiai=1kabxymit dem ten Bit gelöscht (dh oder ) - um die Konstruktion symmetrisch zu machen, wähle wenn und , und wähle wenn und . Verwenden Sie als kompakte Darstellung des Paares. Das ursprüngliche Paar kann wiederhergestellt werden, indem das in gesetzte Bit niedrigster Ordnung berechnet wird , ein 0-Bit an dieser Position in eingefügt wird (was eines von oder ergibt ) und das xor dieser Zahl mit genommen wirdkb=i<kxi2i+i>kxi2i1b=i<kyi2i+i>kyi2i1xxk=0yk=1yxk=1yk=0(a,b)abxya (ergibt das andere Element des Paares).

In dieser Darstellung kann eine beliebige Zahl ungleich Null sein, und kann eine beliebige Zahl mit der Hälfte liegen. Dies ist eine Überprüfung der geistigen Gesundheit: Wir erhalten genau die erwartete Anzahl von Darstellungen ungeordneter Paare.ab

In Pseudo - Code, mit ^, &, |, <<, >>, ~wobei C-like bitweisen Operatoren (XOR, AND, OR, Linksverschiebung, Verschiebung nach rechts, Komplement):

encode(x, y) =
  let a = x ^ y
  let k = lowest_set_bit_position(a)
  let low_mask = (1 << k) - 1
  let z = if x & (1 << k) = 0 then x else y
  return (a, (z & low_mask) | (z & ~low_mask) >> 1)
decode(a, b) =
  let k = lowest_set_bit_position(a)
  let low_mask = (1 << k) - 1
  let x = (b & low_mask) | ((b & ~low_mask) << 1)
  return (x, a ^ x)

0

Ein nichtkonstruktiver Beweis: Es gibt ungeordnet Paare verschiedener 32-Bit-Ganzzahlen.(232×232232)/2=231(2321)<263

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.