Bir kümenin bir bölümünü temsil etmenin kompakt bir yolu nedir?


11

Belirlenen bölümleri temsil etmek için etkili veri yapıları vardır . Bu veri yapıları Union and Find gibi işlemler için iyi zaman karmaşıklıklarına sahiptir, ancak bunlar özellikle yer tasarrufu sağlamaz.

Bir kümenin bir bölümünü temsil etmenin yerden tasarruf sağlayan yolu nedir?

İşte olası bir başlangıç ​​noktası:

Bunu biliyorum bölümleri sayısı ile bir dizi unsurları olan , -inci Çan numarası . İle bir dizi bir bölümünü temsil etmek için optimum alan karmaşıklığı Yani elemanları olan bit. Böyle bir temsili bulmak için, (bir element kümesinin bölüm kümesi ) ve ( ila arasında bir tamsayı kümesi) arasında bire bir eşleme .N N N günlüğü 2 ( B N ) N 1 B NBNNNlog2(BN)N1BN

Hesaplamak için verimli bir haritalama var mı? Ne demek "verimli" ile veya zaman polinomu içinde bu kompakt temsili / kullanımı kolay bir temsile (listeler listesi gibi) / dönüştürmek istiyorum .log 2 ( B N )Nlog2(BN)


, tamsayının # bölümünü temsil ettiği her bir öğeye sadece benzersiz tamsayı atamanın naif / doğal kodlamasından ne kadar uzak olabileceğini merak ediyor ? belki de "o kadar fark değil" ...log2(BN)
vzn

Yanıtlar:


7

bulmak için aşağıdaki yineleme formülünün türetilme şeklini kullanabilirsiniz: Bu, öğesini içeren kısımda başka kaç eleman bulunduğunu göz önüne alarak kanıtlanmıştır . Bunlardan varsa , onlar için seçeneğimiz ve geri kalanını bölümlemek için seçeneklerimiz var.

Bn+1=k=0n(nk)Bk.
n+1nk(nnk)=(nk)Bk

Bunu kullanarak, herhangi bir bölümünü aralığındaki bir sayıya dönüştürmek için yinelemeli bir algoritma verebiliriz . Ben zaten boyutu bir alt dönüştürücü bir yolu olduğunu varsayalım bir aralığında bir dizi (örneğin, bir algoritma Pascal'ın tekrarı ) ile aynı şekilde tasarlanabilir.n+10,,Bn+11k{1,,n}0,,(nk)1(nk)=(n1k)+(n1k1)

içeren parçanın başka element içerdiğini varsayalım . Kodlarını bulun . Kalan tüm öğeleri bu aralığa "sıkıştırarak" bölümünü hesaplayın . Kodunu yinelemeli olarak hesaplayın . Yeni kodn+1kC1{1,,nk}C2

C=l=0nk1(nl)Bl+C1Bnk+C2.

Bir kod verilen diğer yönde, benzersiz bulmak , öyle ki ve Yana , bu şekilde yazılabilir , burada . Şimdi , içeren bölümdeki kodlar ve bölümünü kodlarCk

l=0nk1(nl)BlC<l=0nk(nl)Bl,
C=Cl=0nk1(nl)Bl.
0C<(nk)BnkC1Bnk+C20C2<BnkC1n+1C2{1,,nk}, özyinelemeli olarak çözülebilir. Kod çözmeyi tamamlamak için, sonraki bölümü içeren parçada görünmeyen tüm öğeleri içerecek şekilde "sıkıştırmayı" kaldırmanız gerekir .n+1


Burada bir alt kodlamak için aynı yöntemi kullanarak nasıl olduğu ait boyutu ardışık olarak. Eğer , sonra kodudur , bu nedenle varsayalım . Eğer , , boyutunun alt kümesi olarak kodu olsun ; kod olduğu . Eğer değilse , in bir kodu olmasına izin , boyutunda alt kümesi olarak ; koduS{1,,n}kk=00k>0nSC1S{n}k1{1,,n1}SC1nSC1Sk{1,,n1}Solduğu .C1+(n1k1)

kodunun kodunu çözmek için iki durum vardır. Eğer o kod çözme bir alt ve büyüklüğü olan kod ve çıkış . Aksi takdirde, kod çözme bir alt ve boyutu kod ve çıkış .CC<(n1k1)S{1,,n1}k1CS{n}S{1,,n1}kC(n1k1)S


Mükemmel cevap; teşekkür ederim. Küçük hata: üstündeki nüks formülü için kanıt çizimde, demek istediniz "vardır yerine bu" "vardır olanlar" - o zaman kalan elemanlar içinde bölünebilir yolları . nkkkBk
cberzan
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.