Median of median
Deksripsi
Algoritma ini akan mengambil sebuah list dan index, misalkan median_of_medians(A, i).
Langkah-langkah:
1. Bagi setiap list menjadi sublist dengan panjang 5 (jika kurang tidak masalah)
2. Sort tiap sublist dan tentukan median. Setiap sort yang dilakukan pada sublists tersebut
akan berjalan secara linear O(n).
3. Terapkan algoritma median_of_medians secara rekursif untuk menentukan median
dari semua bagian median.
4. Gunakan median sebagai pivot elemen, x. Pivot akan menjadi aproksimasi median dari
keseluruhan list dan melakukan rekursif sampai didapatkan median yang asli.
5. Lakukan pengurutan dimana elemen yang bernilai kurang dari x, maka akan berada
disebelah kiri dan sebaliknya.
6. Misal k adalah “rank” dari x, yang artinya untuk set dari suatu S, maka x adalah nilai k
terkecil S
7. a. i = k ⇒ return x
b. i < k ⇒ rekursif dari (A[1.., k-1], i) atau sisi kiri dari pivot
c. i > k ⇒ rekursif dari (A[k+1, .., i], i-k) atau sisi kanan dari pivot
Pseudocode / Algo
Dalam algoritma ini misalkan kasus nya setiap list tidak ada duplikasi.
if len(medians) <= 5:
pivot = sorted(medians)[len(medians)/2]
else:
#the pivot is the median of the medians
pivot = median_of_medians(medians, len(medians)/2)
#partitioning step
low = [j for j in A if j < pivot]
high = [j for j in A if j > pivot]
k = len(low)
if i < k:
return median_of_medians(low,i)
elif i > k:
return median_of_medians(high,i-k-1)
else: #pivot = k
return pivot
#Here are some example lists you can use to see how the algorithm works
#A = [1,2,3,4,5,1000,8,9,99]
#B = [1,2,3,4,5,6]
#print median_of_medians(A, 0) #should be 1
#print median_of_medians(A,7) #should be 99
#print median_of_medians(B,4) #should be 5
Kompleksitas
Jika kita lihat dari algoritma tersebut, maka terlihat bahwa kompleksitasnya adalah O(n).
Suatu list dengan panjang n, akan dibagi menjadi n/5 sublists, dan setiap sublist akan mencari
median lagi sehingga bisa kita lihat bahwa n/5 menjadi n/10, namun misalkan terdapat nilai p
sebagai median, maka bisa saja pada n/10 elemen tadi 2 diantaranya ada yang lebih besar dan
lebih kecil, sehingga 3n/10 < p dan worst case yang mungkin adalah kita perlu melakukan
rekursif lagi untuk elemen i yang akan dicari sisanya yaitu 7n/10 elemen.
Sehingga
Untuk partitioning, memerlukan waktu
T(n)=T(n/5)+O(n)
Dan secara keseluruhan dengan faktor adanya rekursi, maka overall kompleksitas nya menjadi
T(n)≤T(n/5)+T(7/10n)+O(n).
Jika dicek menggunakan master theorem akan didapatkan kompleksitas O(n log n).
● Maka, sebenarnya bentuk umum dari rekurensi adalah dalam form T(n) < T(an) + T(bn)
+ cn, jika a + b < 1, maka rekurensi akan menjadi O(n), sebaliknya a+b > 1, maka
rekurensi akan menjadi Ω(nlogn).
Referensi: https://brilliant.org/wiki/median-finding-algorithm/