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.
quelle
x
undy
sind verschieden, dann passt entwederx-y-1
odery-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 32x-y-1
y
x-y-1
x
y-x-1
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 ik ck>⋯>c1
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 kck N- ( ck(ckk)≤N (k-1)N−(ckk) (k−1)
quelle
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.N N(N+1)/2 N(N−1)/2 2log2(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 .N a=x⊕y ⊕ {x,y} (a,x) (a,y) x y x=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 oderx≠y xi i x x=∑ixi2i y k x y k i xi≠yi k i ai=1 k a b x y mit 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 wirdk b=∑i<kxi2i+∑i>kxi2i−1 b=∑i<kyi2i+∑i>kyi2i−1 x xk=0 yk=1 y xk=1 yk=0 (a,b) a b x y a (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.a b
In Pseudo - Code, mit
^
,&
,|
,<<
,>>
,~
wobei C-like bitweisen Operatoren (XOR, AND, OR, Linksverschiebung, Verschiebung nach rechts, Komplement):quelle
Ein nichtkonstruktiver Beweis: Es gibt ungeordnet Paare verschiedener 32-Bit-Ganzzahlen.(232×232−232)/2=231(232−1)<263
quelle