Algoritme awal saya:
- Bandingkan elemen 0 dengan setiap elemen lainnya, catat berapa banyak elemen yang kurang dari itu.
- Ulangi untuk setiap elemen sampai elemen yang lebih besar dari elemen (k-1) ditemukan.
Saya menganggap ini akan mengambil dalam kasus terburuk. Bisakah runtime lebih cepat dicapai tanpa mengurutkan daftar?
search-algorithms
lists
MENGAPA
sumber
sumber
Jawaban:
Gunakan algoritma pemilihan untuk waktu linier https://en.m.wikipedia.org/wiki/Selection_algorithm
sumber
Sayangnya saya tidak bisa hanya berkomentar tetapi saya harus mempostingnya sebagai jawaban.
Bagaimanapun, Anda bisa mencoba menggunakan min-heap pada array yang tidak disortir, Anda harus bisa mendapatkan kompleksitas waktu O (n + k * logn).
sumber
Algoritma Quickselect dapat melakukan itu dalam kompleksitas rata-rata O (n), ini adalah salah satu algoritma seleksi yang paling sering digunakan menurut Wikipedia .
Ini berasal dari QuickSort dan karena itu menderita kompleksitas kasus terburuk O (n²) jika Anda menggunakan pivot yang buruk (masalah yang dapat dihindari dalam praktiknya).
Algoritma singkatnya: Setelah pivoting seperti di QuickSort, hanya turun ke sisi yang lebih rendah atau lebih tinggi dari array - tergantung di mana mereka memiliki elemen yang Anda cari.
sumber
Buat tumpukan maksimum ukuran . Invarian adalah bahwa tumpukan selalu berisi elemen terkecil diamati sejauh ini.k k
Pada akhirnya, heap akan mengandung elemen terkecil dalam daftar.k
Mencari elemen maksimum memiliki biaya konstan. Biaya penyisipan dan penghapusan adalah . Kompleksitas waktu dari metode ini adalahO(k) O(n.logk)
sumber