Input:
Satu set array (angka).
Elemen-elemen dalam setiap array berada dalam urutan, tetapi set array tidak perlu diurutkan. Array tidak harus berukuran sama. Jumlah elemen adalah n .
Output: The th elemen terkecil dari semua elemen dalam input.
Apa algoritma yang paling efisien untuk masalah ini?
Apakah mungkin, misalnya untuk mencapai waktu berjalan ?
Jawaban:
Anda dapat melakukannya dalam waktu dan ruang ekstra sebagai berikut:O(l+k log l) O(l)
Jika Anda mengganti tumpukan biner dengan tumpukan Fibonacci, saya pikir ini membuat Anda turun ke waktu diamortisasi , tetapi dalam praktiknya akan lebih lambat daripada tumpukan biner kecuali jika BESAR.O(l+k) l
Saya menduga bahwa tumpukan Fibonacci terikat optimal, karena secara intuitif Anda akan harus memeriksa setidaknya elemen untuk menemukan th terkecil, dan Anda akan harus memeriksa setidaknya satu elemen dari masing-masing array karena Anda tidak tahu bagaimana mereka diurutkan, yang segera memberi batas bawah .k k l Ω(max(k,l))=Ω(k+l)
sumber
Berikut adalah algoritma acak . Mungkin dapat derandomized menggunakan trik yang sama yang digunakan untuk derandomisasi quickselect yang biasa.O(ℓlog2n)
Kami meniru algoritma pemilihan cepat klasik. Di setiap fase, Anda memilih pivot dan menghitung berapa banyak elemen di bawahnya, di , menggunakan pencarian biner di setiap daftar. Kemudian Anda menghapus elemen di sisi yang salah, dan ulangi. Proses berakhir setelah iterasi dalam harapanO(ℓlogn) logn
sumber
Hal ini tampaknya diselesaikan oleh makalah Generalized selection and ranking (Preliminary Version) oleh Frederickson dan Johnson dalam STOC '80.
Mereka memberikan batas atas dan bawah dari: yang ternyata menjadi untuk sebagian besar distribusi ukuran array.Θ(ℓ+∑ℓi=1log|Ai|) ℓlogn
Algoritma aktual untuk mencapai batas atas rupanya diberikan dalam makalah sebelumnya: Algoritma optimal untuk menghasilkan informasi kuantil dalam X + Y dan matriks dengan kolom diurutkan , Proc. Konferensi Tahunan ke-13 tentang Ilmu dan Sistem Informasi, Universitas Johns Hopkins (1979) 47-52.
sumber
Sebuah -cara merge membutuhkan waktu (menggunakan cara yang efisien untuk mewakili antrian prioritas elemen kepala di setiap daftar), maka Anda memilih elemen -th dalam waktu yang konstan. Saya pikir ini dibahas dalam "Penyortiran dan pencarian" Knuth untuk menyortir. Mendapatkan yang terkecil (atau terbesar) jelas membutuhkan , untuk array yang tidak disortir adalah IIRC.ℓ Θ(nlogℓ) k Θ(ℓ) O(n)
Tolong jelaskan algoritma Anda.
sumber