Comparando un par ordenado (x, y) con un par desordenado {x, y} (conjunto), entonces la información teóricamente, la diferencia es solo un bit, ya que si x viene primero o y requiere exactamente un solo bit para representar.
Entonces, si se nos da un conjunto {x, y} donde x, y son dos enteros diferentes de 32 bits, ¿podemos empaquetarlos en 63 bits (en lugar de 64)? Debería ser posible recuperar los enteros originales de 32 bits del resultado de 63 bits, pero sin poder recuperar su orden.
fuente
x
yy
son diferentes, entonces cualquierax-y-1
oy-x-1
(ambos mod , por supuesto) cabe en 31 bits. Si es pequeño, concatene y los últimos 31 bits de ; de lo contrario concatenar y los últimos 31 bits de . Recupere los dos números tomando los primeros 32 bits como un número y sumando los primeros 32 bits, los últimos 31 bits y la constante 1 (mod ) como el otro. 2 32x-y-1
y
x-y-1
x
y-x-1
Como una adición a la respuesta de DW, tenga en cuenta que este es un caso particular del Sistema de números combinatorios , que mapea de manera compacta una secuencia estrictamente decreciente de enteros no negativos a c k > ⋯ > c 1 N = k ∑ i = 1 ( c ik Ck> ⋯ > c1
Este número tiene una interpretación simple. Si ordenamos estas secuencias lexicográficamente, entonces cuenta el número de secuencias más pequeñas.norte
Para decodificar, simplemente asigne a el valor más grande tal que y decodifique como una secuencia .( c kCk N- ( ck( ckk) ≤N (k-1)norte- ( ckk) ( k - 1 )
fuente
El número total de pares de números desordenados en un conjunto de es . El número total de pares desordenados de números distintos es . Se necesitan bits para representar un par ordenado de números, y si tiene un bit menos, puede representar elementos de un espacio de hasta . El número de pares no necesariamente desordenados no ordenados es un poco más de la mitad del número de pares ordenados, por lo que no puede guardar un poco en la representación; el número de pares distintos no ordenados es un poco menos de la mitad, por lo que puede ahorrar un poco.N ( N + 1 ) / 2 N ( N - 1 ) / 2 2 log 2 ( N ) = log 2 ( N 2 )norte norte( N+ 1 ) / 2 norte( N- 1 ) / 2 2 log2( N) = log2( N2) norte2/ 2
Para un esquema práctico que sea fácil de calcular, con siendo una potencia de 2, puede trabajar en la representación bit a bit. Tome donde es el operador XOR (exclusivo a nivel de bit o). El par se puede recuperar de o . Ahora buscaremos un truco para guardar un bit en la segunda parte, y le daremos un rol simétrico a e para que el orden no pueda recuperarse. Dado el cálculo de cardinalidad anterior, sabemos que este esquema no funcionará en el caso donde .a = x ⊕ y ⊕ { x , y } ( a , x ) ( a , y ) x ynorte a = x ⊕ y ⊕ { x , y} ( a , x ) ( a , y) X y x = y
Si entonces hay alguna posición de bit en la que difieren. Escribiré para el ésimo bit de (es decir, ), y lo mismo para . Supongamos que toma la posición de bit más pequeña donde e difieren: es la más pequeña, de modo que . es el más pequeño tal que : podemos recuperar de . Deje ser ox i i x x = ∑ i x i 2 i y k x y k i x i ≠ y i k i a i = 1 k a b x y k b = ∑ i < k x i 2 i + ∑ i > k x i 2 ∑ i < k yx ≠ y Xyo yo X x = ∑yoXyo2yo y k X y k yo Xyo≠ yyo k yo unyo= 1 k un si X y con el bit borrado (es decir, o ) - para hacer que la construcción sea simétrica, seleccione si y , y elija si y . Use como la representación compacta del par. El par original se puede recuperar calculando el bit de orden más bajo que se establece en , insertando un bit 0 en esta posición en (produciendo uno de o ), y tomando el xor de ese número conk b=b = ∑i < kXyo2yo+ ∑i > kXyo2i - 1 x x k = 0 y k = 1 y x k = 1 y k = 0 ( a , b ) a b xb = ∑i < kyyo2yo+ ∑i > kyyo2i - 1 X Xk= 0 yk= 1 y Xk= 1 yk= 0 ( a , b ) un si X ay un (produciendo el otro elemento del par).
En esta representación, puede ser cualquier número distinto de cero puede ser cualquier número con la mitad del rango. Este es un control de cordura: obtenemos exactamente el número esperado de representaciones de pares desordenados.bun si
En pseudocódigo, con
^
,&
,|
,<<
,>>
,~
siendo C-como operadores bit a bit (XOR, AND, OR, izquierda turno, desplazamiento a la derecha, complemento):fuente
Una prueba no constructiva: hay sin ordenar pares de diferentes enteros de 32 bits.( 232× 232- 232) / 2 = 231( 232- 1 ) < 263
fuente