menemukan elemen k terkecil dalam array di O (k)

12

Ini adalah pertanyaan menarik yang saya temukan di web. Diberikan array yang berisi n angka (tanpa informasi tentangnya), kita harus memroses terlebih dahulu array dalam waktu linier sehingga kita dapat mengembalikan elemen terkecil k dalam waktu O (k), ketika kita diberi angka 1 <= k <= n

Saya telah membahas masalah ini dengan beberapa teman tetapi tidak ada yang bisa menemukan solusi; bantuan apa pun akan dihargai!

catatan cepat: -rangka k elemen terkecil tidak penting-elemen dalam array adalah angka, mungkin bilangan bulat dan mungkin bukan (jadi tidak ada jenis radix) -jumlah k yang tidak diketahui pada tahap pra-pemrosesan. preprocessing adalah O (n) waktu. fungsi (temukan k elemen terkecil) pada waktu O (k).

Idan
sumber
4
Bagaimana kalau menggunakan min-heap?
Shir
1
Lihatlah perhitungan k-skyband dan top-k. Makalah cs.sfu.ca/~jpei/publications/subsky_tkde07.pdf memiliki ulasan yang bagus tentang literatur terkait.
András Salamon
1
Shir-Saya telah memeriksa ide tumpukan-min. namun, untuk mencetak k angka terkecil dalam min heap adalah dalam waktu O (klogn) dan bukan O (k) seperti yang dipersyaratkan
Idan
4
@ idannik: Menurut Anda mengapa diperlukan waktu untuk menemukan k elemen terkecil dalam min-heap? Ω(klogn)k
Kristoffer Arnsfelt Hansen
8
Saya tidak berpikir ini level penelitian. Sepertinya tugas. Di mana Anda menemukannya?
Kaveh

Jawaban:

24

Memproses ulang array nilai dalam waktu O ( n ) :nO(n)

  • in
  • sementara i>2
    • Hitung median dari A [ 1 .. i ] dalam waktu O ( i )mA[1..i]O(i)
    • partisi menjadi A [ 1 .. i / 2 - 1 ] m dan A [ i / 2 + 1 .. i ] m dalam waktu yang bersamaan.A[1..i]A[1..i/21]mA[i/2+1..i]m
    • ii/2

Total waktu precomputation adalah dalam O(1+2+4+...+n)O(n)

Jawab pertanyaan untuk elemen terkecil di A dalam waktu O ( k ) :kAO(k)

  • llog2k
  • pilih elemen x dari A [ 2 l . .2 l + 1 ] dalam waktu O ( 2 l ) O ( k )(k2l)xA[2l..2l+1]O(2l)O(k)
  • partisi oleh x dalam waktu yang bersamaanA[2l..2l+1]x

berisielemen terkecil k .A[1..k]k

Referensi:

  • Pada tahun 1999, Dor dan Zwick memberikan algoritma untuk menghitung median elemen dalam waktu 2,942 n + o ( n ) perbandingan, yang menghasilkan algoritma untuk memilih elemen ke- k dari n elemen tidak berurutan dalam perbandingan kurang dari 6 n .n2.942n+o(n)kn6n
Jeremy
sumber
1
Saya kira lingkaran luar seharusnya 'untuk saya di '. Apakah algoritma Anda berbeda dari yang ada di jawaban Yuval Filmus? {2lgn,,4,2,1}
Radu GRIGore
2
Ini adalah generalisasi dari algoritma saya ke sembarang . Itu juga menjabarkan beberapa detail implementasi yang (sengaja) ditinggalkan dari jawaban saya. n
Yuval Filmus
3
@YuvalFilmus Anda ingin menyiratkan dengan komentar Anda bahwa jawaban saya tidak etis dekat dengan Anda? Ini adalah solusi yang muncul di benak saya ketika saya mengulas pertanyaan itu. Saya melihat bahwa Anda memposting yang serupa, tetapi ternyata tidak jelas, jadi saya menulis sendiri (sebagai lawan melakukan edit besar dari Anda). Yang penting pada akhirnya adalah kualitas jawaban pada sistem, bukan siapa yang menulisnya: lencana dan reputasi hanyalah insentif, bukan tujuan dalam diri mereka sendiri.
Jeremy
4
n
2
Oh :( Maaf soal itu. (Meskipun saya masih akan berpikir memberikan jawaban lengkap menjadi prioritas di atas kecurigaan penugasan)
Jeremy
14

n=2m2m1,2m2,2m3,,1kt2t1k2t2t2k2tkO(2t)=O(k)

Θ(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

n+n/2+n/4++1<2nAkA[0..n/2k1]n/2k

Yuval Filmus
sumber
1
O(1)kO(n)
4
lognnlogn
3
@ AndrásSalamon: Jika Anda membaca jawaban yang diberikan oleh Jeremy (yang terlihat bagi saya hampir sama dengan yang ini) Anda melihat bahwa Anda pertama kali memproses seluruh array, lalu bagian pertama, dan seterusnya.
Radu GRIGore
3
n+n/2+n/4++1<2n
5
Kebetulan algoritma ini muncul sebagai subrutin dalam jawaban saya untuk pertanyaan sebelumnya: cstheory.stackexchange.com/questions/17378/…
David Eppstein
2

O(n)O(k)k

Frederickson, Greg N. , Algoritma yang optimal untuk seleksi dalam min-heap , Inf. Komputasi. 104, No. 2, 197-214 (1993). ZBL0818.68065 ..

hqztrue
sumber
1
kO(k)
@ a3nm Memang bukan algoritma yang sederhana, tapi saya sudah memperbarui referensi.
hqztrue
kkO(k)k
kx<xO(k)
kk/2k
0

kk

jbapple
sumber
1
k
2
Saya melihat. Kesalahanku.
jbapple