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 (n−k)×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(nlog⁡k) 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(k∗n/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(nlog⁡k)kO(k)O(log⁡k)O(k+nlog⁡k)O(nlog⁡k)

O(log⁡n)O(n)kk

O(log⁡n)O(k)O(log⁡n)264log⁡264=64kn


O(n×log⁡min(k,n−k))

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,n−k))O(k)knmin(k,n−k)n2O(min(k,n−k))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,n−k))CMM≤k≤nk≤C(n−k)n=k→+∞).O(min(k,n−k))⊊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.