Porównując parę uporządkowaną (x, y) z parą nieuporządkowaną {x, y} (zestaw), a następnie teoretycznie, różnica wynosi tylko jeden bit, ponieważ to, czy x jest pierwsze, czy y wymaga dokładnie jednego bitu do przedstawienia.
Więc jeśli otrzymamy zestaw {x, y}, gdzie x, y to dwie różne 32-bitowe liczby całkowite, czy możemy spakować je w 63 bitach (raczej 64)? Powinno być możliwe odzyskanie oryginalnych 32-bitowych liczb całkowitych z wyniku 63-bitowego, ale bez możliwości odzyskania ich kolejności.
źródło
x
iy
są różne, to jedenx-y-1
luby-x-1
(oba mod , oczywiście) mieści się w 31 bitach. Jeśli jest mały, to konkatenuj i ostatnie 31 bitów ; w przeciwnym razie konkatenuje i ostatnie 31 bitów . Odzyskaj dwie liczby, biorąc pierwsze 32 bity jako jedną liczbę i dodając pierwsze 32 bity, ostatnie 31 bitów i stałą 1 (mod 2 32 ) jako drugą.x-y-1
y
x-y-1
x
y-x-1
Jako dodatek do odpowiedzi DW, zauważ, że jest to szczególny przypadek kombinatorycznego systemu liczb , który zwięźle odwzorowuje ściśle malejącą sekwencję liczb całkowitych nieujemnych c k > ⋯ > c 1 dok ck>⋯>c1
Liczba ta ma prostą interpretację. Jeśli uporządkujemy te sekwencje leksykograficzne, wówczas zlicza liczbę mniejszych sekwencji.N
Aby zdekodować, po prostu przypisz największą wartość, taką jak i zdekoduj jako sekwencję .ck (ckk)≤N N−(ckk) (k−1)
źródło
Całkowita liczba nieuporządkowanych par liczb w zbiorze wynosi . Całkowita liczba nieuporządkowanych par odrębnych liczb wynosi . Potrzeba bitów do przedstawienia uporządkowanej pary liczb, a jeśli masz jeden bit mniej, możesz reprezentować elementy przestrzeni do . Liczba nieuporządkowanych niekoniecznie odrębnych par jest nieco większa niż połowa liczby uporządkowanych par, więc nie możesz zapisać trochę w reprezentacji; liczba nieuporządkowanych odrębnych par jest nieco mniejsza niż połowa, więc możesz trochę zaoszczędzić.N N(N+1)/2 N(N−1)/2 2log2(N)=log2(N2) N2/2
Aby uzyskać praktyczny schemat, który jest łatwy do obliczenia, przy czym jest potęgą 2, możesz pracować z reprezentacją bitową. Weźmy gdzie jest operatorem XOR (bitowe wykluczenie lub). Pary można odzyskać z lub . Teraz szukamy sposobu na zaoszczędzenie jednego bitu w drugiej części i nadanie i symetrycznej roli, aby nie można było odzyskać kolejności. Biorąc pod uwagę powyższe obliczenia liczności, wiemy, że ten schemat nie zadziała w przypadku, gdy .N a=x⊕y ⊕ {x,y} (a,x) (a,y) x y x=y
Jeśli to jest trochę pozycji, w której się różnią. Napiszę dla tego bitu (tj. ), i podobnie dla . Niech przyjmie najmniejszą pozycję bitu, w której i różnią się: jest najmniejszą taką, że . jest najmniejszym takim, że : możemy odzyskać z . Niech będzie albo albox≠y xi i x x=∑ixi2i y k x y k i xi≠yi k i ai=1 k a b x y z tym bitem skasowanym (tj. lub ) - aby konstrukcja była symetryczna, wybierz jeśli i , i wybierz jeśli i . Użyj jako zwartej reprezentacji pary. Pierwotną parę można odzyskać, obliczając bit najniższego rzędu ustawiony w , wstawiając bit 0 w tej pozycji (uzyskując jeden z lub ) i biorąc xor tej liczby za pomocąk 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 (uzyskując drugi element pary).
W tej reprezentacji może być dowolną liczbą niezerową, a może być dowolną liczbą o połowie zakresu. Jest to kontrola rozsądku: otrzymujemy dokładnie oczekiwaną liczbę reprezentacji nieuporządkowanych par.a b
W Pseudokod, z
^
,&
,|
,<<
,>>
,~
to C-like operatorów bitowe (XOR, AND, OR, lewy shift prawym zmianowych, dopełniacza):źródło
Niekonstruktywny dowód: istnieją nieuporządkowane pary różnych 32-bitowych liczb całkowitych.(232×232−232)/2=231(232−1)<263
źródło