Untuk menemukan median array yang tidak disortir, kita dapat membuat min-heap dalam waktu untuk n elemen, dan kemudian kita dapat mengekstraksi satu per satu elemen n / 2 untuk mendapatkan median. Tetapi pendekatan ini akan membutuhkan waktu O ( n log n ) .
Bisakah kita melakukan hal yang sama dengan beberapa metode dalam waktu ? Jika kita bisa, lalu bagaimana caranya?
Jawaban:
Ini adalah kasus khusus dari algoritma seleksi yang dapat menemukan th elemen terkecil dari sebuah array dengan k adalah setengah dari ukuran array. Ada implementasi yang linier dalam kasus terburuk.k k
Algoritma seleksi generik
Pertama mari kita lihat suatu algoritmak
find-kth
yang menemukan th elemen terkecil dari sebuah array:Fungsi
split(A, pivot)
mengembalikanL,R
sedemikian rupa sehingga semua elemen diR
lebih besar daripadapivot
danL
yang lainnya (minus satu kemunculanpivot
). Kemudian semua dilakukan secara rekursif.Kasus terburuk linier: algoritma median-of-median
Pivot yang lebih baik adalah median semua median sub array
A
ukuran 5, dengan menggunakan prosedur memanggil pada larik median ini.Perhatikan bahwa sebagian besar waktu menggunakan pivot acak lebih cepat.
sumber
5
standar? Bagaimana jika ukuran A kurang dari 5?return A[k]
tidak benar (kecualiA
diurutkan yang akan membuat algoritma diperdebatkan). Jikasplit
terjadi membagiA
sehinggak = |L| + 1
Anda masih tidak tahu di manak
elemen th. Kasing dasar Anda adalah kapan|A| = 1
lagi Anda masih perlu melakukan salah satu dari dua panggilan rekursif.Ide utama dari algoritma ini adalah menggunakan sampling. Kita harus menemukan dua elemen yang berdekatan dalam urutan susunan array dan yang memiliki median terletak di antara mereka. Lihat referensi [MU2017] untuk diskusi lengkap.
[MU2017] Michael Mitzenmacher dan Eli Upfal. "Probabilitas dan Komputasi: Pengacakan dan Teknik Probabilistik dalam Algoritma dan Analisis Data," bab 3, halaman 57-62. Cambridge University Press, Edisi kedua, 2017.
sumber