Sadece O (k) bellek O (n) zaman ile belirli bir dizideki kinci en küçük elemanı bulma


11

Farzedelim ki , tek tek n sayı dizisini okuduk . Nasıl bulunur k sadece kullanarak 'inci en küçük elemanı O(k) hücre bellek ve doğrusal zamanda ( O(n) ). Sanırım ilk k dizi terimlerini kaydetmeliyiz ve k+1 'terimini elde ettiğimizde, bunun k ' en küçük öğesi olamayacağından emin olduğumuz bir terimi silin ve sonra k+1 'terimini kaydedin . Bu nedenle, her adımda bu kullanılamaz terimi gösteren bir göstergemiz olmalı ve bu gösterge her adımda hızlı bir şekilde güncellenmelidir. "Max" ile başladım; ancak hızlı bir şekilde güncellenemez; Eğer max'ı düşünürsek, o zaman ilk silme sırasında maks'i özlüyoruz ve max'ı O(k) ve bunun nedenini (nk)×O(k) lineer olmayan zamanda aramalıyız . Belki de ilk k dizilim terimlerini daha akıllıca kaydetmeliyiz .

Bu sorunu nasıl çözerim?


1
Çevrimiçi bir algoritma ile ilgileniyor musunuz, yoksa herhangi bir algoritma mı?
Yuval Filmus

Eğer k=θ(n) o zaman sıra istatistikleri algoritması kullanarak bunu yapabilirsiniz. Eğer k=o(n) daha sonra yapabileceği O(k) hafıza ve O(nlogk) herhangi bir yükseklik dengeli ağaç kullanarak zamanı.
Shreesh


Google'da kullanabileceğiniz doğrusal zaman yerinde algoritmalar vardır, ancak bunlar biraz karmaşıktır.
Yuval Filmus

@ xavierm02 aynı seçim sorunu değil. Çünkü bir bellek sınırı kısıtı var.
Shahab_HK

Yanıtlar:


16

2k2kkO(k)kk

O(kn/k)=O(n)O(k)


kk=1min

1
Bazen, doğrusal zaman seçim algoritması çok fazla alan kullanır. Örneğin, bir akış bağlamında veya giriş dizisi değişmez olduğunda kullanım için uygun değildir.
jbapple

Bunlar geçerli noktalar.
orlp

3

O(k)O(nlogk)kO(k)O(logk)O(k+nlogk)O(nlogk)

O(logn)O(n)kk

O(logn)O(k)O(logn)264log264=64kn


O(n×logmin(k,nk))

xavierm02O = . Kanıt: için en kötü durum olan . İçin en kötü durum ise . Sabit bir faktör içinde aynıdır, bu nedenle = . O(min(k,nk))O(k)knmin(k,nk)n2O(min(k,nk))O(k)
orlp

@ xavierm02 Olduğu söyleniyor, hala güzel bir hızlanma :)
orlp

un,k=k , ancak . Varsayalım. Sonra bazı ve bazı var, böylece her , açıkça yanlış olan (çünkü Yani . O(k)O(min(k,nk))CMMknkC(nk)n=k+).O(min(k,nk))O(k)
xavierm02

@ xavierm02 gösterimi bilmiyorum . Adil olmak gerekirse, genel olarak çok boyutlu büyük- notasyonuna aşina değilim , özellikle boyutlarının ilgisiz olmadığı düşünüldüğünde . un,kOn,k
orlp
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.