Sırayı göz ardı ederek iki tamsayıyı sıkıştırma


20

Sıralı bir çifti (x, y) sıralanmamış bir çiftle (x, y} (set) karşılaştırırsak, teorik olarak, x'in önce gelip gelmediği ya da y'nin temsil etmesi için tek bir bit gerektirdiği gibi, fark sadece bir bittir.

Eğer x, y iki farklı 32-bit tamsayı olan bir küme {x, y} verilirse, bunları 63 bite (daha ziyade 64) ayırabilir miyiz? Orijinal 32 bit tam sayıları 63 bit sonuçtan kurtarmak, ancak siparişlerini geri almak mümkün olmamalıdır.

Yanıtlar:


27

Evet, olabilir. Eğer x<y , eşlemek {x,y} numaraya

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

O göstermek kolaydır f örten ve bu benzersiz çözülecek şekilde. Ayrıca, 0x<y<232 , 0f(x,y)<263231 , bu, kümesini {x,y}63 bitlik bir eşleştirir. )f(x,y) . Kod çözmek için üzerinde ikili aramayı kullanabilir yveya bir kare kök alabilirsiniz: y yaklaşık olarak olmalıdır..2f(x,y)


1
tıpkı 1 + 2 + 3 + ... + y + x güzel!
Troy McClure

1
sıralanmamış nts için herhangi bir genelleme? :) ikinci düşünce, yeterince büyük kısmi türevleri olan birçok quadform işi yapacak
Troy McClure

4
Düşük hesaplama maliyeti için cazip olabilecek başka bir cevap: eğer xve yfarklıysa, ya x-y-1ya y-x-1( ya da her ikisi de mod ) 31 bit'e sığar. Eğer küçük, daha sonra birleştirmek ve son 31 bit arasında ; aksi halde bitiştirin ve son 31 biti . İlk 32 biti bir sayı olarak alıp ilk 32 biti, son 31 biti ve diğer sabit 1'i (mod 2 32 ) ekleyerek iki sayıyı kurtarın . 232x-y-1yx-y-1xy-x-1232
Daniel Wagner

1
ilk sayı "sadece orada" olduğu için yönteminiz daha fazla sayı eklemek için de güzelleşti
Troy McClure

4
@DW: Bu temsile nasıl geldiğinizi de ekler misiniz? Aksi halde ince havadan çıkardığınız anlaşılıyor.
Mehrdad

9

DW cevap bir ek olarak, nota bu özel bir durum olduğunu Kombinatoryal sayısı Sistemi kompakt bir kesinlikle azalan dizisi eşler, negatif olmayan tamsayılar c k > > c 1 için N = k Σ i = 1 ( c benkck>>c1

N=i=1k(cii).

Bu sayının basit bir yorumu vardır. Bu sekansları sözlükbilimsel olarak sıralarsak, daha küçük sekansların sayısını sayar.N

Kod çözmek için değerini en büyük değere atayın ( c kckve kod çözmeN- ( ck(ckk)N bir(k-1)-seque olarak.N(ckk)(k1)


4

Bir dizi sayı düzensiz çiftlerinin sayısı olan , N ( N + 1 ) / 2 . Sıralanmamış çiftlerinin sayısı farklı sayı olduğu N ( N - 1 ) / 2 . Bu alan 2 log 2 ( K ) = log 2 ( K 2 ) bir sıralı sayı çift temsil etmek için bitleri ve bir daha az bit varsa, up to arasında bir boşluk elemanlarını ifade edebilir N 2 / 2NN(N+1)/2N(N1)/22log2(N)=log2(N2)N2/2. Sırasıyla zorunlu olmayan farklı çiftlerin sayısı, sipariş edilen çiftlerin yarısından biraz fazladır, bu nedenle gösterimde biraz tasarruf edemezsiniz; sıralanmamış farklı çiftlerin sayısı yarıdan biraz daha azdır, böylece biraz tasarruf edebilirsiniz.

Hesaplaması kolay olan pratik bir şema için, 2 gücü olduğu için, bitsel sunum üzerinde çalışabilirsiniz. Al bir = X y operatör (özel veya bit) XOR. { X , y } çifti ( a , x ) veya ( a , y ) ' den kurtarılabilir . Şimdi ikinci kısımda bir bit kaydetmek için bir numara arayacağız ve x ve y'ye simetrik bir rol vereceğizNa=xy{x,y}(a,x)(a,y)xyböylece sipariş geri alınamaz. Yukarıdaki kardinalite hesaplaması göz önüne alındığında, bu şemanın olduğu durumda çalışmayacağını biliyoruz .x=y

Eğer sonra ihtilafa bazı bit konum yoktur. I yazacaksýn x i için i inci bit x (yani X = Σ i x i 2 i için benzer şekilde), ve y . Let k en küçük bit pozisyon almak x ve y farklıdır: k küçüğüdür i öyle ki x iy i . k en küçük i'dir, öyle ki bir i =xyxiixx=ixi2iykxykixiyikiai=1kabxykb=i<kxi2i+i>kxi2i1b=i<kyi2i+i>kyi2i1xxk=0yk=1yxk=1yk=0(a,b)abxya

abaralığın yarısı olan herhangi bir sayı olabilir. Bu bir sağlık kontrolüdür: tam olarak sırasız çiftlerin beklenen sayıda temsilini alıyoruz.

Pseudocode ile ^, &, |, <<, >>, ~olmak C benzeri bit operatörleri (XOR ve ya da sol-kaydırma, sağa kaydırma, tamamlayıcı):

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

Yapıcı olmayan bir kanıt: var (232x232-232)/2=231(232-1)<263 farklı 32 bit tamsayıların sıralanmamış çiftleri.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.