O (k) dizisindeki en küçük k elemanlarını bulma


12

Bu web'de bulduğum ilginç bir soru. N numarası içeren bir dizi verildiğinde (bunlar hakkında hiçbir bilgi olmadan), diziyi doğrusal zamanda önceden işlemeliyiz, böylece 1 (<) k sayısı verildiğinde O (k) zamanında k en küçük öğeleri döndürebiliriz. <= n

Bu sorunu bazı arkadaşlarla tartışıyorum ama hiç kimse bir çözüm bulamadı; herhangi bir yardım mutluluk duyacağız!

hızlı notlar: -k en küçük elemanların sırası önemli değildir -dizideki elemanlar sayıdır, tamsayı olabilir ve olmayabilir (bu yüzden sayı tabanı sıralaması yoktur) -k işleme öncesi aşamasında k sayısı bilinmemektedir. ön işleme O (n) süresidir. O (k) zamanında fonksiyon (k en küçük elemanları bul).


4
Min-yığın kullanmaya ne dersiniz?
Shir

1
K-skyband ve top-k hesaplamasına bakın. Cs.sfu.ca/~jpei/publications/subsky_tkde07.pdf makalesi ilgili literatürü güzel bir şekilde gözden geçirmiştir .
András Salamon

1
Shir-I min-yığın fikrini inceledim. ancak, min yığındaki en küçük sayıları yazdırmak için O (klogn) süresinde değil, O (k) süresinde değil
Idan

4
@idannik: Neden bunu alır sence bulmak için zaman bir min-yığın en küçük elemanlar? kΩ(klogn)k
Kristoffer Arnsfelt Hansen

8
Bunun araştırma düzeyinde olduğunu sanmıyorum. Bir ödev gibi görünüyor. Nerede buldun?
Kaveh

Yanıtlar:


24

zamanında değerleri dizisini önceden işleyin :O ( n )nO(n)

  • in
  • isei>2
    • zamanında nin medyan değerini hesaplayınA [ 1 .. i ] O ( i )mA[1..i]O(i)
    • bölüm içine ve , aynı zamanda.A [ 1 .. i / 2 - 1 ] m A [ i / 2 + 1 .. i ] mA[1..i]A[1..i/21]mA[i/2+1..i]m
    • ii/2

Toplam ön hesaplama süresiO(1+2+4+...+n)O(n)

zamanında en küçük elemanlar için bir cevaplayın :A O ( k )kAO(k)

  • llog2k
  • seçin inci elemanı ve zaman olarakx A [ 2 l . 0,2 l + 1 ] O ( 2 l ) O ( k )(k2l)xA[2l..2l+1]O(2l)O(k)
  • bölüm tarafından aynı andaxA[2l..2l+1]x

kA[1..k] en küçük elementleri içerir .k

Referanslar:

  • 1999 yılında, D- ve Zwick medyanını hesaplamak için bir algoritma elde içinde zaman içinde elemanları seçmek için bir algoritma elde edilir karşılaştırmaları, gelen elemanından daha kısa bir sürede sırasız elemanları karşılaştırmalar.2.942 n + o ( n ) k n 6 nn2.942n+o(n)kn6n

1
Sanırım dış döngü 'i için ' olmalıdır. Algoritmanız Yuval Filmus'un cevabından farklı mı? {2lgn,,4,2,1}
Radu GRIGDaha fazla

2
Bu algoritmamın keyfi . Ayrıca cevabımdan (kasıtlı olarak) çıkarılan bazı uygulama detaylarını da açıklar. n
Yuval Filmus

3
@YuvalFilmus Yorumunuzla cevabımın etik olarak size yakın olduğunu ima etmek ister misiniz? Soruyu gözden geçirdiğimde akla gelen çözüm budur. Benzer bir şey yayınladığınızı gördüm, ancak net değil, bu yüzden kendim yazdım (büyük bir düzenleme yapmanın aksine). Nihayetinde önemli olan, sistemlerde cevapların kalitesi, onları kimin yazdığı değil: rozetler ve itibar, yalnızca kendi hedefleri değil, teşviklerdir.
Jeremy

4
@Jeremy Hiç de değil; Sadece iki çözüm aynı (ancak sizinki keyfi için çalışıyor ) ve aslında bir ev ödevi sorusu olması durumunda detayları etmedim. n
Yuval Filmus

2
Oh :( O zaman için üzgünüm. (Yine de ödev şüpheleri karşısında öncelikli cevaplar vermeyi düşünürdüm)
Jeremy

14

Sadelik için olduğunu varsayın . konumlarındaki öğeleri bulmak için doğrusal zaman seçim algoritmasını kullanın ; bu doğrusal zaman alır. Verilen , arayan bu şekilde ; olduğunu unutmayın . Sıradaki tüm öğeleri en fazla filtreleyin ve şimdi zamanında konumundaki öğeyi bulmak için doğrusal zaman seçim algoritmasını kullanın .2 m - 1 , 2 m - 2 , 2 m - 3 , , 1 k t 2 t - 1k 2 t 2 t2 k 2 t k O ( 2 t ) = O ( k )n=2m2m1,2m2,2m3,,1kt2t1k2t2t2k2tkO(2t)=O(k)

Açıklama: Önişlemenin zaman alacağı anlaşılıyor ve eğer dikkatli değilseniz bu durum böyledir. Ön işlemin doğrusal zamanda nasıl yapılacağı aşağıda açıklanmıştır:Θ(nlogn)

while n > 0:
  find the (lower) median m of A[0..n-1]
  partition A in-place so that A[n/2-1] = m
  n = n/2

Yerinde bölümleme, hızlı sıralamadaki gibi yapılır. Çalışma süresi cinsinden doğrusaldır ve bu nedenle doğrusaldır. Sonunda, dizi biri aşağıdaki özelliği: her biri için , oluşur küçük elemanlar.A k A [ 0 .. n / 2 k - 1 ] n / 2 kn+n/2+n/4++1<2nAkA[0..n/2k1]n/2k


1
Doğal olarak. Dizi sıralanırsa bunu ön işleme almadan de çözebilirsiniz . Belki bulabilirsiniz doğrusal zaman seçim algoritmasının farkında değildir k süresi içinde inci en büyük eleman O ( n ) ? O(1)kO(n)
Yuval Filmus

4
@Yuval Filmus: Toplam n oturum n adımı için algoritma kez çalıştırmıyor musunuz ? Yoksa aklınızda bir çeşit serpiştirme var mıydı? lognnlogn
András Salamon

3
@ AndrásSalamon: Jeremy tarafından verilen cevabı okursanız (bana bununla neredeyse aynı görünüyor), önce tüm diziyi, sonra ilk yarıyı vb.
Radu GRIGDaha fazla

3
@ AndrásSalamon Radu doğru. Medyanı bulduktan sonra diziyi (yerinde) alt ve üst yarısına böler, sonra alt yarısında geri çekersiniz. Çalışma süresi orantılıdır . n+n/2+n/4++1<2n
Yuval Filmus

5
Bu arada, bu algoritma daha önceki bir soruya cevabımda
David Eppstein

2

Önce min-yığın oluşturmak için O(n) kullanın. Biz kullanabilirsiniz bilinmektedir O(k) bulmak için k bir min-yığın en küçük unsurları:

Frederickson, Greg N. , Min yığınında seçim için en uygun algoritma , Inf. Comput. 104, No. 2, 197-214 (1993). ZBL0818.68065 ..


1
Her bir öğeyi kaldırmak yığının boyutunda logaritmik zaman aldığından, O ( k ) zamanında bir min yığınından en küçük öğelerini nasıl çıkarabileceğimizi görmüyorum . Burada aklınızdan geçenleri açıklığa kavuşturabilir misiniz? Teşekkürler! kO(k)
a3nm

@ a3nm Gerçekten basit bir algoritma değil, ama referansı güncelledim.
hqztrue

Maalesef bildiğim kadarıyla eklediğiniz referansı söyleyebilirim sadece seçme bahsediyor -inci en küçük elemanı (yani tek bir unsur değil, k en küçük öğeleri) zaman içinde O ( k ) . Bunu ayıklanması adapte olur görmüyorum k en küçük unsurları. Referansı açıklayabilir veya güncelleyebilir misiniz? kkO(k)k
a3nm

@ a3nm evet referans size yalnızca en küçük elemanı x verir . Ancak bunu bildikten sonra, O ( k ) ' daki tüm < x öğelerini bulmak için yığın içinde bir dfs gerçekleştirebilirsiniz . kx<xO(k)
hqztrue

Maalesef, bu öğeleri bulmak için hangi DFS'yi gerçekleştireceğinizi görmüyorum? (Bazıları ataları olmayabilir bildiğim kadarıyla örneğin, yerini söyleyebilirim, yığın oyunu bırakanların en küçük eleman, yani k / 2 konumunu bilerek-inci elemanı k -inci elemanı önemsiz değil .)kk/2k
a3nm

0

Bulmak için doğrusal zaman seçimini kullanın , o zaman kullanarak quicksort bir bölme adımı yapmak büyük inci eleman k eksen olarak inci en büyük elemanı.kk


1
Orijinal soru, ön işleme zamanında bilinmediğinden bahseder ....k
Jeremy

2
Anlıyorum. Benim hatam.
jbapple
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.