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(N−1)/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=x⊕y⊕{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 oderx≠yxiixx=∑ixi2iykxykixi≠yikiai=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>kxi2i−1b=∑i<kyi2i+∑i>kyi2i−1xxk=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)