Eksik eleman problemi için zaman uzayı dengesi


14

İşte iyi bilinen bir sorun.

Pozitif tamsayıların dizisi verildiğinde, dizide A[1n]olmayan en küçük pozitif tamsayıyı çıktılar.

Sorun O(n) uzayda ve zamanda çözülebilir : diziyi okuyun, 1 , 2 , , n + 1'in meydana gelip gelmediğini O(n) uzayda takip edin, en küçük elemanı tarayın.1,2,,n+1

Zaman için yer ticareti yapabileceğinizi fark ettim. Eğer varsa O(nk)sadece bellek, bunukturda yapabilir vezamanını alabilirsinizO(kn). Özel bir durumda, açıkça sabit boşluklu ikinci dereceden zaman algoritması vardır.

Sorum şu:

Bu optimal bir denge midir , yani timespace=Ω(n2) midir? Genel olarak, böyle bir sınır nasıl kanıtlanabilir?

O (1) 'de dizilere sınırlı aritmetik ve rastgele erişimli RAM modelini varsayalım.

Bu problem için ilham: tek bantlı modelde palindromlar için zaman uzaması dengesi (örneğin, buraya bakın ).


2
Hayır, dizinizi sıralayabilir, sonra eksik sayıyı bulabilirsiniz (ilk sayı 1 olmalı, ikinci 2 olmalı, ... başka bulacaksınız)) O (n) 'da, bu sıralama yapılabilir iNPLACE MergeSort, aracı ile O ( 1 ) zaman bu yüzden ekstra boşluk, alan ait O ( n log n ) . Senin sorunun tam olarak var ya da değil bilmiyorum (bu nedenle ben cevap vermedi, Ayrıca daha iyi bir sınır olup olmadığını bilmiyorum). O(nlogn)O(1)O(nlogn)

Bence giriş salt okunur. (Değilse, sorun zaman / O ( 1 ) alanında en iyi şekilde çözülebilir : girişi 2 ile çarpın ve O ( n ) / O ( n ) algoritmasını simüle etmek için parite kullanın )O(n)O(1)O(n)/O(n)
sdcvvc

Sabit uzay algoritması nedir? Görünüşe göre benim için "açık" n 2 sürümü için alanı gerekir gibi görünüyorlognn2
Xodarap

Bu modelde, kelime boyutu tamsayıları ; o daha uygunsa, sizinle sorunun herhangi varyantı cevap verebilir zaman uzay = Q ( n 2O(1)bazı sabitk için. timespace=Ω(n2logkn)k
sdcvvc

@sdcvvc, algoritmanızı anlayamıyorum, biraz daha açıklar mısınız? (bitlere okumanın O ( log n ) aldığını unutmayın ). O(n)/O(1)O(logn)

Yanıtlar:


2

O(nlogn)O(1)O(nlog2n)O(logn)

n0n1[1,n+1]n0n1n0+n1=n+1b{0,1}nb1bn0n1n0+n1=n+1n

Yani algoritmamız şöyle görünecek:

  1. x2br[0,2b)x+1[1,n+1]r2bb=0,r=0

  2. x0r2b+1x1r+2b2b+1x0+x1=xx+1r2b(r,b+1),(r+2b,b+1)1

  3. 2bn+1[1,n+1]r2brr

Açıkça, algoritma adımlarında durur , her birinin süresine (giriş dizisi üzerinde tek geçiş) ihtiyacı vardır. Ayrıca, yalnızca bellek kelimesi gereklidir.O(logn)O(n)O(1)


O zamandan sonra soruya cevap verdiğim için mutluyum :)
sdcvvc

1

Eğer tanımlarınızı anlarsam, bu sabit uzay ile doğrusal zamanda yapılabilir. Bu en düşük sınırdır, çünkü en azından tüm girdiyi okumamız gerekir.

Bu soruda verilen cevap tatmin edici.

Bunu daha az zaman veya alanla çalıştırmak imkansızdır ve fazladan zaman veya alan eklemek işe yaramaz, bu yüzden burada uzay-zaman ödünleşimi yoktur. ( yı gözlemleyin, böylece gözlemlediğiniz değiş tokuş her durumda asimptotik olarak tutulmaz.)n=O(n/k)

Genel sorunuz açısından, uzay-zaman ödünleşimlerini kanıtlamanıza yardımcı olacak herhangi bir güzel teorem hakkında bilmiyorum. Bu soru , (bilinen) kolay bir cevap olmadığını göstermektedir. Temelde:

Bir dilin zamanında (bir miktar boşluk kullanarak) ve alanında (bir süre kullanarak ) karar verilebildiğini varsayalım . Bulabilecegimizin bu şekilde ile Karar verilebilen olan içinde çalıştığı zaman ve alanı?tsf,gLMf(t,s)g(t,s)

bilinmemektedir ve güçlü bir cevap, kolay bir çözümün bulunmadığını ima eden birçok açık problemi (özellikle SC hakkında) çözecektir.


EDIT: Tamam, tekrar ile (ama yine de boyutunda bir girdi ile mümkün olan maksimum sayı olduğunu varsayıyorum ).nn+1

Algoritmamızın en az olası cevap arasında ayrım yapabilmesi gerektiğini gözlemleyin . Verilerin her geçişinde en fazla veri parçası alabileceğimizi varsayalım . O zaman tüm cevapları ayırt etmek için geçişlerine ihtiyacımız olacak . varsayarsak saatinde çalışırız . Bence bu istediğini kanıtlıyor.k n / k k = n / s nnkn/kk=n/snn/sn=sn

Zorluk, her seferinde sadece bitleri aldığımızı göstermektir . Tek yasal operasyonumuzun = olduğunu varsayarsak, iyiyiz. Ancak, daha karmaşık işlemlere izin verirseniz, daha fazla bilgi alabilirsiniz.k


3
Bağladığınız soru, her sayının en fazla bir kez göründüğünü varsayar. Bu varsayımı yapmıyorum, bu yüzden çözüm geçerli değil. İkinci bağlantı için teşekkürler.
sdcvvc

@sdcvvc: Benim hatam, aşina olduğum sürümü kullandığınızı varsaydım. Tam bir cevabım yok, ancak yorum yapmak için çok uzun - umarım düzenlemem yararlıdır.
Xodarap

5
Argümanınızı "EDIT" den sonra almıyorum. Tek bir geçişte bitlerini toplayabilseniz bile , prensipte olası çıkışı ayırt etmek yeterlidir . Bu nedenle bu argüman değil , sadece geçişlerinin alt sınırını ima edebilir . 2 k n / 2 k n / kk 2kn/2kn/k
JeffE
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.