Membandingkan pasangan berurutan (x, y) dengan pasangan yang tidak berurutan {x, y} (set), maka informasi secara teoritis, perbedaannya hanya satu bit, karena apakah x lebih dulu atau y membutuhkan tepat satu bit untuk diwakili.
Jadi, jika kita diberikan satu set {x, y} di mana x, y adalah dua bilangan bulat 32-bit yang berbeda, dapatkah kita mengemasnya menjadi 63 bit (bukan 64)? Seharusnya dimungkinkan untuk memulihkan bilangan bulat 32 bit asli dari hasil 63 bit, tetapi tanpa dapat memulihkan pesanan mereka.
sumber
x
dany
berbeda, maka salah satux-y-1
atauy-x-1
(keduanya mod , tentu saja) cocok dalam 31 bit. Jika kecil, maka gabungkan dan 31 bit terakhir ; jika tidak digabungkan dan 31 bit terakhir dari . Pulihkan kedua angka dengan mengambil 32 bit pertama sebagai satu angka dan menambahkan 32 bit pertama, 31 bit terakhir, dan konstanta 1 (mod ) sebagai yang lainnya. 2 32x-y-1
y
x-y-1
x
y-x-1
Sebagai tambahan untuk jawaban DW, perhatikan bahwa ini adalah kasus khusus dari Combinatorial Number System , yang memetakan secara ketat urutan bilangan bulat non-negatif ke c k > ⋯ > c 1 N = k ∑ i = 1 ( c ik ck>⋯>c1
Angka ini memiliki interpretasi sederhana. Jika kita memesan urutan ini secara leksikografis, maka menghitung jumlah urutan yang lebih kecil.N
Untuk mendekode, cukup berikan nilai terbesar sehingga dan dekode sebagai -setelahnya.( c kck N- ( ck(ckk)≤N (k-1)N−(ckk) (k−1)
sumber
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.N N(N+1)/2 N(N−1)/2 2log2(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 .N a=x⊕y ⊕ {x,y} (a,x) (a,y) x y x=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≠y xi i x x=∑ixi2i y k x y k i xi≠yi k i ai=1 k a b x y dengan 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 dengank 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 (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.a b
Dalam pseudocode, dengan
^
,&
,|
,<<
,>>
,~
menjadi C-seperti operator bitwise (xor, dan, atau, kiri-shift, kanan-shift, pelengkap):sumber
Bukti nonkonstruktif: ada tidak berurutan pasang bilangan bulat 32-bit yang berbeda.(232×232−232)/2=231(232−1)<263
sumber