回答:
はい、できます。場合、集合{ x 、y }を数値にマッピングします
が全単射であることを示すのは簡単なので、これを一意にデコードできます。また、場合0 ≤ X < Y < 2 32、我々は0 ≤ F (X 、Y )< 2 63 - 2 31をこのセットマップので、{ X 、Yを} 63ビット数をF (X 、Y )。デコードするには、yのバイナリ検索を使用するか、平方根を取ります。yは約shouldでなければなりません。
x
とy
が異なる場合、どちらかx-y-1
またはy-x-1
(もちろんmod も)31ビットに収まります。場合小さい、次いで連結し、最後の31ビットの、それ以外の場合は、最後の31ビットを連結します。最初の32ビットを1つの数値とし、最初の32ビット、最後の31ビット、および定数1(mod 2 32)をもう1つの数値として加算することにより、2つの数値を復元します。x-y-1
y
x-y-1
x
y-x-1
この特定の場合であることをDWの答え、ノートに加えとしてコンビナトリアル番号システムコンパクトの厳密減少配列マッピング、非負整数cがK > ⋯ > cが1の N = k個のΣ iは= 1 ( Cを私
この番号の解釈は簡単です。これらのシーケンスを辞書式に並べると、は小さいシーケンスの数をカウントします。
デコードするだけ割り当てように最大値( CのKデコードN- ( CのK a(k−1)-シーケンスとして。
セット内の番号の順序なしペアの総数は、N (N + 1 )/ 2です。異なる番号の順序付けられていないペアの総数はN (N − 1 )/ 2です。これは、かかる2 ログ2(N )= ログ2(N 2)番号の順序対を表すためのビットを、そして使用すると、1つの少ないビットを持っている場合は、最大の空間の要素を表すことができ、N 2 / 2。順序付けられていない不必要に区別されるペアの数は、順序付けされたペアの数の半分よりもわずかに多いため、表現に少しは保存できません。順序付けられていない個別のペアの数は半分よりわずかに少ないため、少し節約できます。
が2の累乗である計算が簡単な実用的なスキームの場合、ビット単位の表現で作業できます。取る= X ⊕ Y ⊕は、 XOR(ビット単位の排他的論理和)演算子です。ペア{ x 、y }は(a 、x )または(a 、y )から回復できます。次に、2番目の部分で1ビットを節約し、xとyに対称的な役割を与えるためのトリックを探します。注文を回復できません。上記の基数計算を考えると、このスキームは場合には機能しないことがわかります。
場合、異なるビット位置があります。私は書くつもりのx 私のために私はの番目のビットX(すなわち、X = Σ I X I 2 I)、および同様のため、Y。ましょうkは最小のビット位置取りX及びYは異なった:kが最小となるIようにX I ≠ yのI。kが最小となるiは、その結果のI =: aから kを回復できます。ましょう bはいずれであっても、X又は Yと K消去番目のビット(すなわち、 B = Σ I < K、X 、I 2 、I + Σ I > K X 、I 2 、I - 1又は B = Σ I < K、Y 、I 2 、I + Σ I > k y i 2 i −) -建設対称を作るために、ピックXを場合 X K =0及び Y K =1、及びピックyの場合は、X 、K =1及び Y K =0。ペアのコンパクトな表現として(a、b)を使用します。元のペアは、aに設定されている最下位ビットを計算し、bのこの位置に0ビットを挿入して(xまたはyのいずれかを生成)、その数のxorを取得することで回復できます
擬似コードでは、と^
、&
、|
、<<
、>>
、~
Cライクビット単位演算子(XOR、及び、又は、左シフト、右シフト、補数)です。
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)
非構造的証明:があります unordered pairs of different 32-bit integers.