推 FRAXIS: 這兩種方法應該是一樣的 都會有兩個遞迴呼叫 10/27 08:11
推 FRAXIS: 所以你的遞迴式有問題.. 10/27 08:13
→ can18: 為什麼1~3步可以獨立? 就是遞迴下去做啊 10/27 08:43
為何不能獨立出來?
→ can18: 還有你第一個的遞迴式也寫錯了吧 10/27 08:45
→ can18: 5個: T(n) = T(n/5) + T(7n/10) + O(n) 10/27 08:46
第一個遞迴式是參考林立宇的寫法,只是概算,不是精算,但不影響結果。
S_1 ˙˙˙˙˙
─────
˙˙˙˙˙
─────
˙˙*˙˙
─────
˙˙˙˙˙
─────
˙˙ S_2
從圖可觀察到,S_2的大小至少有1/4*n。
因此去掉S_2後,最多剩下 3/4*n。
→ can18: 3個: T(n) = T(n/3) + T(2n/3) + O(n) 10/27 08:48
推 can18: 你知道你第二個的問題在哪嗎? 10/27 08:55
→ can18: 第三步是把 n/5 個數丟進 "原本" 的演算法 10/27 08:56
→ can18: 簡單的說 根本不存在你所謂的演算法G 10/27 08:57
→ can18: 有的話你直接用G求median就好了 不用那麼複雜 10/27 08:57
有啊。我不是第一個想到的。我也覺得這樣很複雜。
演算法筆記 - Sequence Manipulation
http://www.csie.ntnu.edu.tw/~u91029/SequenceManipulation.html
"Select in Array: Median-of-Medians Algorithm
...
時間複雜度O(N)"
→ nat99up: 你漏掉小堆中位數之間的selection10/27 08:55
推 nat99up: 分三堆的話S-_1跟S_2的大小為1-(1/2 * 1/3 *2) 10/27 08:59
看來分3堆時,概算會出錯
→ nat99up: c大其實7/10跟3/4的版本都有10/27 08:57
→ can18: 謝謝n大 抱歉 我不知道這個版本10/27 08:58
推 can18: 不是啊 = = 你那個網站O(n)就是用分5堆的才得到啊 10/27 09:06
推 can18: 所以你直接用G求就好了啊 但實際上G就是分5堆 10/27 09:08
我應該是誤會你的意思了
→ can18: 所以你是想表面上分3堆 骨子用分5堆求然後宣稱分3堆可以O(n 10/27 09:09
→ can18: )嗎 10/27 09:09
調整推文順序,方便閱讀。
→ can18: 你有懂了嗎 還是我再講詳細一點 10/27 09:28
抱歉,收回前言,我還是不瞭解。
問題1.
把median of medians演算法獨立出來,
不管是5個一組,還是3個一組,我都算出費時O(n)。
問題2.
若我在問題1中的推導無誤,那麼改寫後的selection algo.,
不管是5個一組,還是3個一組,也都費時O(n)。
問題3.
若1.2.我都沒錯,那為什麼過去那些研究演算法的學者,
有什麼好理由不把median of medians演算法獨立出來?
→ nat99up: 我誤以為你的S1和S2是剩下來的n了 把1-拿掉 10/27 09:29
推 gary70812: 我認為你的G演算法如果是分三組“遞迴”下去的話,找出 10/27 13:18
→ gary70812: 的數對selected algorithm 是沒有幫助的,不管是三個一 10/27 13:18
→ gary70812: 組或五個一組都一樣,假設有十組5個數,共50個,五個一 10/27 13:18
→ gary70812: 組,你的遞迴最後會剩兩個數 這時候該挑哪個?挑哪個 10/27 13:18
→ gary70812: 都對原演算法沒有幫助,以上我的觀點,不一定對 10/27 13:18
為何兩個任一個都沒有幫助?
推 gary70812: 因為他不一定在中間,沒辦法保證下次只要算T(3/4*n) 10/27 13:29
一般會假設 n <= n_0 時,T(n_0) = Θ(1),as n_0 is constant.
例如我已算出T(50)為常數時間,即T(50) = Θ(1)。
則只要 n<=50,T(n)都為Θ(1)。
推 gary70812: 嗯...那這樣你提出的方法就是O(n)了?還是你還有發現 10/27 14:44
→ gary70812: 哪裡有問題 10/27 14:44
推 can18: 其實最後一組剩幾個都沒差 頂多花常數時間BigO下會被去掉 10/27 15:15
→ can18: 原po的問題是 他所謂的G演算法必須架構在5個一堆下才能達O( 10/27 15:16
→ can18: n) 10/27 15:16
→ can18: 所以其實只有主程式是3個一堆 副程式都是5個一堆 10/27 15:17
C大可能誤會了。
我的意思是,把median of medians演算法獨立出來,變成演算法G。
再把演算法G放回修改後selection algo.,即演算法F。
不管是5個一組,還是3個一組,都是算出費時O(n)。
怎麼可能會有這麼好康的代誌?
程式變簡單了,各個函數只專注作自己的事。
G專做 partition (median of medians),也就是找中位數近似值;
F專做 selection,要 partition 時,只需 call G 就好。
不像原本的,selection 與 partition (median of medians) 攪和在一起。
受到的限制變小了,原本的必須5個以上一組才能在線性時間算完,
現在只要3個以上一組。
以前那些大師怎麼可能沒想到,一定有什麼理由使他們不這麼做。
不然就是我算錯了。
哈。我知道問題出在哪裡了。
如C大所言,根本不存在演算法G。
準確來說,應該是那個演算法G求出的並不是 median of medians,
不管是5個一組或是3個一組。
如下圖所示。
"P"為演算法G最後找到的pivot。
"◎"代表大於等於P。
"。"代表小於等於P。
小
│ 。│。│˙│。│。│˙│˙│˙│˙
│ 。│。│˙│。│P│◎│˙│◎│◎
↓ ˙│˙│˙│˙│◎│◎│˙│◎│◎
大
小
│ 。│。│˙
│ 。│P│◎
↓ ˙│◎│◎
大
看到F大提供的文件才想到。
感謝以上各位大大。
※ 編輯: JKLee (111.248.76.116), 10/28/2017 02:07:35