[理工] 資結 演算法 median of medians selection algo.時間複雜度

作者: JKLee (J.K.Lee)   2017-10-27 02:37:24
老師在上課時說,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|小的數。
作者: FRAXIS (喔喔)   2017-10-27 08:11:00
這兩種方法應該是一樣的 都會有兩個遞迴呼叫所以你的遞迴式有問題..
作者: can18 (18號)   2017-10-27 08:43:00
為什麼1~3步可以獨立? 就是遞迴下去做啊還有你第一個的遞迴式也寫錯了吧5個: T(n) = T(n/5) + T(7n/10) + O(n)3個: T(n) = T(n/3) + T(2n/3) + O(n)你知道你第二個的問題在哪嗎?第三步是把 n/5 個數丟進 "原本" 的演算法簡單的說 根本不存在你所謂的演算法G有的話你直接用G求median就好了 不用那麼複雜
作者: nat99up (NAt)   2017-10-27 08:55:00
你漏掉小堆中位數之間的selection分三堆的話S-_1跟S_2的大小為1-(1/2 * 1/3 *2)c大其實7/10跟3/4的版本都有
作者: can18 (18號)   2017-10-27 08:58:00
謝謝n大 抱歉 我不知道這個版本所以你直接用G求就好了啊 但實際上G就是分5堆所以你是想表面上分3堆 骨子用分5堆求然後宣稱分3堆可以O(n)嗎你有懂了嗎 還是我再講詳細一點
作者: nat99up (NAt)   2017-10-27 09:29:00
我誤以為你的S1和S2是剩下來的n了 把1-拿掉
作者: gary70812 (1)   2017-10-27 13:18:00
我認為你的G演算法如果是分三組“遞迴”下去的話,找出的數對selected algorithm 是沒有幫助的,不管是三個一組或五個一組都一樣,假設有十組5個數,共50個,五個一組,你的遞迴最後會剩兩個數 這時候該挑哪個?挑哪個都對原演算法沒有幫助,以上我的觀點,不一定對因為他不一定在中間,沒辦法保證下次只要算T(3/4*n)嗯...那這樣你提出的方法就是O(n)了?還是你還有發現哪裡有問題
作者: can18 (18號)   2017-10-27 15:15:00
其實最後一組剩幾個都沒差 頂多花常數時間BigO下會被去掉原po的問題是 他所謂的G演算法必須架構在5個一堆下才能達O(n)所以其實只有主程式是3個一堆 副程式都是5個一堆
作者: FRAXIS (喔喔)   2017-10-27 20:40:00

Links booklink

Contact Us: admin [ a t ] ucptt.com