Jumlah total pasangan angka yang tidak berurutan dalam satu set adalah . Jumlah pasangan unordered dari yang berbeda angka adalah . Dibutuhkan bit untuk mewakili pasangan angka yang terurut, dan jika Anda memiliki lebih sedikit, Anda dapat mewakili elemen ruang hingga . Jumlah pasangan tidak-tidak-harus-tidak berurutan sedikit lebih dari setengah jumlah pasangan yang dipesan sehingga Anda tidak dapat menyimpan sedikit dalam representasi; jumlah pasangan berbeda yang tidak berurutan sedikit kurang dari setengah, sehingga Anda dapat menghemat sedikit.NN(N+1)/2N(N−1)/22log2(N)=log2(N2)N2/2
Untuk skema praktis yang mudah dihitung, dengan menjadi kekuatan 2, Anda bisa bekerja pada representasi bitwise. Ambil mana adalah XOR (bitwise eksklusif atau). Pasangan dapat dipulihkan dari atau . Sekarang kita akan mencari trik untuk menyimpan satu bit di bagian kedua, dan memberikan peran simetris ke dan sehingga pesanan tidak dapat dipulihkan. Dengan perhitungan kardinalitas di atas, kami tahu skema ini tidak akan berfungsi jika .Na=x⊕y⊕{x,y}(a,x)(a,y)xyx=y
Jika maka ada beberapa posisi bit di mana mereka berbeda. Saya akan menulis untuk bit ke- (yaitu ), dan juga untuk . Biarkan mengambil posisi bit terkecil di mana dan berbeda: adalah terkecil sehingga . adalah terkecil sehingga : kita dapat memulihkan dari . Biarkan menjadi ataux ix≠yxiixx=∑ixi2iykxykixi≠yikiai=1kabxydengan bit dihapus (yaitu atau ) - untuk membuat simetris konstruksi, pilih jika dan , dan pilih jika dan . Gunakan sebagai representasi kompak dari pasangan. Pasangan asli dapat dipulihkan dengan menghitung bit urutan terendah yang diatur dalam , memasukkan 0 bit pada posisi ini dalam (menghasilkan salah satu atau ), dan mengambil xor dari angka itu dengankb=∑i<kxi2i+∑i>kxi2i−1b=∑i<kyi2i+∑i>kyi2i−1xxk=0yk=1yxk=1yk=0(a,b)abxya (menghasilkan elemen pasangan lainnya).
Dalam representasi ini, bisa berupa bilangan bukan nol, dan dapat berupa bilangan apa saja dengan setengah kisaran. Ini adalah pemeriksaan kewarasan: kami mendapatkan persis jumlah yang diharapkan dari representasi pasangan tidak berurutan.ab
Dalam pseudocode, dengan ^
, &
, |
, <<
, >>
, ~
menjadi C-seperti operator bitwise (xor, dan, atau, kiri-shift, kanan-shift, pelengkap):
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)