En comparant une paire ordonnée (x, y) à une paire non ordonnée {x, y} (ensemble), puis en théorie, la différence n'est que d'un bit, car si x vient en premier ou y nécessite exactement un seul bit pour représenter.
Donc, si on nous donne un ensemble {x, y} où x, y sont deux entiers 32 bits différents, pouvons-nous les regrouper en 63 bits (plutôt 64)? Il devrait être possible de récupérer les entiers 32 bits d'origine à partir du résultat 63 bits, mais sans pouvoir récupérer leur ordre.
la source
x
ety
sont différents, alors l'unx-y-1
ou l' autrey-x-1
(les deux mod , bien sûr) tient sur 31 bits. Si est petit, alors concatène et les 31 derniers bits de ; sinon concaténer et les 31 derniers bits de . Récupérez les deux nombres en prenant les 32 premiers bits comme un nombre et en ajoutant les 32 premiers bits, les 31 derniers bits et la constante 1 (mod ) comme l'autre. 2 32x-y-1
y
x-y-1
x
y-x-1
En complément de la réponse de DW, notez qu'il s'agit d'un cas particulier du système de nombres combinatoires , qui mappe de manière compacte une séquence strictement décroissante de entiers non négatifs à c k > ⋯ > c 1 N = k ∑ i = 1 ( c ik ck>⋯>c1
Ce nombre a une interprétation simple. Si nous ordonnons lexicographiquement ces séquences, alors compte le nombre de séquences plus petites.N
Pour décoder, attribuez simplement à la plus grande valeur telle que et décodez comme une séquence .ck (ckk)≤N N−(ckk) (k−1)
la source
Le nombre total de paires non ordonnées de nombres dans un ensemble de est . Le nombre total de paires non ordonnées de nombres distincts est . Il faut bits pour représenter une paire ordonnée de nombres, et si vous avez un bit de moins, vous pouvez représenter des éléments d'un espace allant jusqu'à . Le nombre de paires non ordonnées non nécessairement distinctes est légèrement supérieur à la moitié du nombre de paires ordonnées, vous ne pouvez donc pas enregistrer un peu dans la représentation; le nombre de paires distinctes non ordonnées est légèrement inférieur à la moitié, vous pouvez donc économiser un peu.N N(N+1)/2 N(N−1)/2 2log2(N)=log2(N2) N2/2
Pour un schéma pratique facile à calculer, étant une puissance de 2, vous pouvez travailler sur la représentation au niveau du bit. Prenez où est l'opérateur XOR (bitwise exclusif ou). La paire peut être récupérée à partir de ou . Nous allons maintenant chercher une astuce pour enregistrer un bit dans la deuxième partie, et donner un rôle symétrique à et afin que l'ordre ne puisse pas être récupéré. Étant donné le calcul de cardinalité ci-dessus, nous savons que ce schéma ne fonctionnera pas dans le cas où .N a=x⊕y ⊕ {x,y} (a,x) (a,y) x y x=y
Si alors il y a une position de bits où ils diffèrent. J'écrirai pour le ème bit de (ie ), et de même pour . Soit la plus petite position binaire où et diffèrent: est le plus petit tel que . est le plus petit tel que : on peut récupérer partir de . Soit soit soitx≠y xi i x x=∑ixi2i y k x y k i xi≠yi k i ai=1 k a b x y avec le ème bit effacé (ie ou ) - pour rendre la construction symétrique, choisissez si et , et choisissez si et . Utilisez comme représentation compacte de la paire. La paire d'origine peut être récupérée en calculant le bit de poids faible défini dans , en insérant un bit 0 à cette position en (donnant l'un de ou ) et en prenant le xor de ce nombre aveck 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 (donnant l'autre élément de la paire).
Dans cette représentation, peut être n'importe quel nombre différent de zéro et peut être n'importe quel nombre avec la moitié de la plage. Il s'agit d'un test de cohérence: nous obtenons exactement le nombre attendu de représentations de paires non ordonnées.a b
En pseudocode, avec
^
,&
,|
,<<
,>>
,~
étant C-like opérateurs binaires (XOR, et, ou, à décalage à gauche, décalage à droite, complément):la source
Une preuve non constructive: il y a non ordonné paires d'entiers 32 bits différents.(232×232−232)/2=231(232−1)<263
la source