老師在上課時說,selection algorithm 中的 median of medians,
若改成3個3個一組,時間複雜度就會超過O(n)。
但我用的第二種方法卻無法得到這個結果,我哪裡出錯了?
====================================================
第一種方法:
原本的遞迴關係式(5個5個一組)會從
T(n) = T(n/5) + T(3/4*n) + O(n)
變成
T(n) = T(n/3) + T(3/4*n) + O(n)。
新的T(n) = O(n^{1+log_{4/3}(13/12)})。比O(n)大。
================================================
S_1 ˙˙˙˙˙
─────
˙˙˙˙˙
─────
˙˙*˙˙
─────
˙˙˙˙˙
─────
˙˙ S_2
================================================
第二種方法:
以下參考自:林立宇 2006 演算法講義 p.37 【演算法 2-5】
The median of medians selection algorithm
Select(A[size n],k)
1. 將input的n個數每5個一組,除了最後一組不足5個數,而是n mod 5個。
總共ceiling(n/5)組。
2. 將每組作sorting,並求得各組之median。
3. 將step 2得到的ceiling(n/5)個median當input,遞迴去求medians的median,p。
4. 從n個數中,收集小於與大於p的數,分別放入集合S_1與S_2。(見上圖)
5. 假設p為第x小的數。
若k=x,則return p;
若k<x,則去掉被S_2包含的數,再遞迴求剩餘數中第k小的數;
若k>x,則去掉被S_1包含的數,再遞迴求剩餘數中第k-|S_1|小的數。