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 )nortenorte( N+ 1 ) / 2norte( N- 1 ) / 22 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 ynortea = x ⊕ y⊕{ x , y}( a , x )( a , y)Xyx = 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 ≠ yXyoyoXx = ∑yoXyo2yoykXykyoXyo≠ yyokyounyo= 1kunsiXycon 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 - 1XXk= 0yk= 1yXk= 1yk= 0( a , b )unsiXayun (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.bunsi
En pseudocódigo, con ^
, &
, |
, <<
, >>
, ~
siendo C-como operadores bit a bit (XOR, AND, OR, izquierda turno, desplazamiento a la derecha, complemento):
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)