順序を無視して2つの整数を圧縮する


20

順序付けられたペア(x、y)を順序付けられていないペア{x、y}(セット)と比較すると、理論的にはxは最初に来るかyが表現するために正確に1ビットを必要とするかの違いは1ビットだけです。

したがって、x、yが2つの異なる32ビット整数であるセット{x、y}が与えられた場合、それらを63ビット(64ではなく)にパックできますか?63ビットの結果から元の32ビット整数を復元できますが、順序を復元することはできません。

回答:


27

はい、できます。場合、集合{ x y }を数値にマッピングしますx<y{x,y}

f(x,y)=y(y1)/2+x.

が全単射であることを示すのは簡単なので、これを一意にデコードできます。また、場合0 X < Y < 2 32、我々は0 F X Y < 2 63 - 2 31をこのセットマップので、{ X Yを} 63ビット数をF X Y 。デコードするには、yのバイナリ検索を使用するか、平方根を取ります。yは約shouldでなければなりませんf0x<y<2320f(x,y)<263231{x,y}f(x,y)yy2f(x,y)


1
1 + 2 + 3 + ... + y + xのように素敵です!
トロイマクルーア

1
n個の順序付けされていない整数への一般化 :)考え直して、十分な大きさの偏導関数を持つ多くの四角形が仕事をします
トロイマクルーア

4
計算コストが低いことから魅力的な別の答え:xyが異なる場合、どちらかx-y-1またはy-x-1(もちろんmod も)31ビットに収まります。場合小さい、次いで連結し、最後の31ビットの、それ以外の場合は、最後の31ビットを連結します。最初の32ビットを1つの数値とし、最初の32ビット、最後の31ビット、および定数1(mod 2 32)をもう1つの数値として加算することにより、2つの数値を復元します。232x-y-1yx-y-1xy-x-1232
ダニエルワグナー

1
最初の数は缶チェーンので、「そこ」であるとして、あなたの方法は、また、より多くの数字を追加することにうまく一般化
トロイマクルーア

4
@DW:この表現を思いついた方法を追加してください。それ以外の場合は、薄い空気から引き出したようです。
Mehrdad

9

この特定の場合であることをDWの答え、ノートに加えとしてコンビナトリアル番号システムコンパクトの厳密減少配列マッピング、非負整数cがK > > cが1N = k個のΣ iは= 1 Cをkck>>c1

N=i=1k(cii).

この番号の解釈は簡単です。これらのシーケンスを辞書式に並べると、は小さいシーケンスの数をカウントします。N

デコードするだけ割り当てように最大値 CのKckデコードN- CのK(ckk)N ak1-シーケンスとして。N(ckk)(k1)


4

セット内の番号の順序なしペアの総数は、N N + 1 / 2です。異なる番号の順序付けられていないペアの総数はN N 1 / 2です。これは、かかる2 ログ2N = ログ2N 2番号の順序対を表すためのビットを、そして使用すると、1つの少ないビットを持っている場合は、最大の空間の要素を表すことができ、N 2 / 2NN(N+1)/2N(N1)/22log2(N)=log2(N2)N2/2。順序付けられていない不必要に区別されるペアの数は、順序付けされたペアの数の半分よりもわずかに多いため、表現に少しは保存できません。順序付けられていない個別のペアの数は半分よりわずかに少ないため、少し節約できます。

が2の累乗である計算が簡単な実用的なスキームの場合、ビット単位の表現で作業できます。取る= X Y ⊕は、 XOR(ビット単位の排他的論理和)演算子です。ペア{ x y }a x またはa y から回復できます。次に、2番目の部分で1ビットを節約し、xyに対称的な役割を与えるためのトリックを探します。Na=xy{x,y}(a,x)(a,y)xy注文を回復できません。上記の基数計算を考えると、このスキームは場合には機能しないことがわかります。x=y

場合、異なるビット位置があります。私は書くつもりのx のために私はの番目のビットX(すなわち、X = Σ I X I 2 I)、および同様のため、Y。ましょうkは最小のビット位置取りX及びYは異なった:kが最小となるIようにX IyのIkが最小となるiは、その結果のI =xyxiixx=ixi2iykxykixiyiki 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 ai=1kabxykb=i<kxi2i+i>kxi2i1) -建設対称を作るために、ピックXを場合 X K =0及び Y K =1、及びピックyの場合は、X 、K =1及び Y K =0。ペアのコンパクトな表現としてabを使用します。元のペアは、aに設定されている最下位ビットを計算し、bのこの位置に0ビットを挿入して(xまたはyのいずれかを生成)、その数のxorを取得することで回復できますb=i<kyi2i+i>kyi2i1xxk=0yk=1yxk=1yk=0(a,b)abxya

ab

擬似コードでは、と^&|<<>>~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)

0

非構造的証明:があります (232×232232)/2=231(2321)<263 unordered pairs of different 32-bit integers.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.