Comparando um par ordenado (x, y) a um par não ordenado {x, y} (conjunto) e, em seguida, informações teoricamente, a diferença é de apenas um bit, pois se x vem primeiro ou y requer exatamente um único bit para representar.
Portanto, se recebermos um conjunto {x, y} em que x, y são dois números inteiros de 32 bits diferentes, podemos agrupá-los em 63 bits (em vez de 64)? Deve ser possível recuperar os números inteiros originais de 32 bits a partir do resultado de 63 bits, mas sem conseguir recuperar a ordem deles.
fonte
x
ey
for diferente, então umx-y-1
ouy-x-1
(ambos mod , é claro) cabe em 31 bits. Se for pequeno, concatene e os últimos 31 bits de ; caso contrário, concatenar e os últimos 31 bits de . Recupere os dois números, tomando os primeiros 32 bits como um número e adicionando os primeiros 32 bits, os últimos 31 bits e a constante 1 (mod ) como o outro. 2 32x-y-1
y
x-y-1
x
y-x-1
Como uma adição à resposta da DW, observe que este é um caso particular do Sistema Combinatório de Números , que mapeia compactamente uma sequência estritamente decrescente de números inteiros não negativos parak ck>⋯>c1
Este número tem uma interpretação simples. Se ordenarmos essas sequências lexicograficamente, conta o número de sequências menores.N
Para decodificar, apenas atribua a o maior valor, de modo que e decodifique como uma sequência .ck (ckk)≤N N−(ckk) (k−1)
fonte
O número total de pares de números não ordenados em um conjunto de é . O número total de pares não ordenados de números distintos é . São necessários bits para representar um par ordenado de números e, se você tiver um bit a menos, poderá representar elementos de um espaço de até . O número de pares não ordenados não necessariamente distintos é um pouco mais da metade do número de pares ordenados, portanto você não pode economizar um pouco na representação; o número de pares distintos não ordenados é um pouco menos da metade, para que você possa economizar um pouco.N N(N+1)/2 N(N−1)/2 2log2(N)=log2(N2) N2/2
Para um esquema prático fácil de calcular, com sendo uma potência de 2, você pode trabalhar na representação bit a bit. Tome que é o operador XOR (exclusivo bit a bit ou). O par pode ser recuperado de ou . Agora, procuraremos um truque para economizar um bit na segunda parte e atribuir uma função simétrica a e para que o pedido não possa ser recuperado. Dado o cálculo da cardinalidade acima, sabemos que esse esquema não funcionará no caso em que .N a=x⊕y ⊕ {x,y} (a,x) (a,y) x y x=y
Se , há alguma posição de bit onde eles diferem. Escreverei para o ésimo bit de (ie ) e da mesma forma para . Seja a menor posição de bit onde e diferem: é a menor tal que . é o menor tal que : podemos recuperar de . Seja ou oux≠y xi i x x=∑ixi2i y k x y k i xi≠yi k i ai=1 k a b x y com o bit apagado (ou seja, ou ) - para tornar a construção simétrica, escolha se e e escolha se e . Use como a representação compacta do par. O par original pode ser recuperado calculando o bit de ordem mais baixa definido em , inserindo um bit 0 nesta posição em (produzindo um de ou ) e levando o xor desse número comk 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 (produzindo o outro elemento do par).
Nesta representação,a pode ser qualquer número diferente de zero pode ser qualquer número com metade do intervalo. Esta é uma verificação de sanidade: obtemos exatamente o número esperado de representações de pares não ordenados.b
Em pseudocódigo, com
^
,&
,|
,<<
,>>
,~
sendo C-como operadores de bits (XOR, e, ou, desvio para a esquerda, direita-shift, complemento):fonte
Uma prova não construtiva: existem pares não ordenados de diferentes números inteiros de 32 bits.(232×232−232)/2=231(232−1)<263
fonte