作者swon ()
看板Grad-ProbAsk
標題Re: [理工] [資結]-98清大-資應所
時間Sun Oct 18 02:20:37 2009
※ 引述《afulist (亞弗利斯特)》之銘言:
: Consider the problem: Give a sequence S=X1,X2,.....,Xn of element and an
: integer k, where 1<=k<=n, find the kth-smallest element in S.
: (a)Give a linear-time worst case algorithm for solving this problem
選第 k 大的值利用 Median of Medians 的方式 (Prune and Search)
Input:Sequence S, k
Output:kth-smallest element
(Step 1) 將 n 個元素分成 n/r 群(取天花板),每群 r 個,不足 r 個補上無限大
(此處考慮 n>=r ,如果 n < r 時就用 Brute-Force Method 即可,r 為常數)
(Step 2) 將 n/r 群分別進行排序
(Step 3) 先取出 n/r 群的各個中位數,再取出這些 n/r 個中位數的中位數
(Median of Medians) 簡稱 MM
(Step 4) 利用 MM 進行 Partition 動作,將 S Sequence 分成三個 Subset
S1(<MM 的元素)、S2(=MM 的元素)、S3(> MM的元素)
(Step 5) If (k <=|S1|) 在 S1 中遞迴尋找
ElseIf k<=|S1|+|S2| 即 MM
Else 在 S3 中遞迴尋找
通常取 r = 5 做處理,下面就取 r = 5 時來做分析
: (b)Analyze the complexity of your algorithm in (a).
令 T(n) 為其時間函數
(Step 1) 掃描整個序列一遍 => O(n)
(Step 2) 排序需要 n/5 * O(5log5) = O(n)
(Step 3) 取出 n/r 個數的中位數需要 T(n/r) => T(n/5)
(Step 4) Partition 再掃描整個序列一遍 => O(n)
(Step 5) 遞迴處理 ==> T(3/4n)
以下圖為例假設有 25 個元素,取 r = 5 做完 Step 1~4 的情形如下
其中 x 以左都代表群中小於等於 x 的元素 (因為 x 為中位數)
x 以右都代表群中大於等於 x 的元素
--------------
第一群 | o o x | o o
| |
第二群 | o o x | o o
| -----|---------
第三群 | o o | MM | o o |
-------------- |
第四群 o o | x o o |
| |
第五群 o o | x o o |
---------------
假定我們要尋找的 k-th element 落在 S1(< MM 元素)
則我們至少可以過慮掉右下方格裡的這些元素
同理,如果落在 S3 我們至少可以過慮掉左上方格裡的這些元素
總之,最差可以過慮掉 n/4 個元素,再遞迴處理剩下四分之三 n 的元素
===> 所以尚需 T(3/4 n) 的時間進行遞迴處理
故 T(n) = O(1) , n <= 5
而 T(n) = T(n/5) + T(3/4 n) + O(n), n > 5
(方法 1) 利用 Recursive Tree:1/5+3/4 < 1 => T(n) = O(n)
(方法 2) T(n) = T(n/5) + T(3/4 n) + O(n)
<= 2T(3/4 n) + O(n)
log 2
4/3
以 Master Method n < n => T(n) = O(n)
(方法 3) By Induction, 假設 T(n) <= 20nc 成立
當 n<=5 時,T(n) <= 20nc = C => 成立
假設 n < k 時 T(k) <= 20 kc 成立
考慮 n = k 時
T(k) = T(k/5) + T(3/4 k) + O(k)
<= 20c(k/5) + 20c(3/4 k) + ck
= 4kc + 15kc + kc = 20 kc
故 T(n) <= 20nc 成立 => T(n) = O(n)
註:如果 Quick Sort 運用此 Select k-th smallest element 方式
選擇第 n/2 大的元素來當作 Partition 的 Pivot
此時 Quick Sort 即使在 Worst Case 依舊可以是 O(nlogn)
但通常考試都還是以 Worst Case 為 O(n^2)
: 這題要線性時間找第K個元素
: 請問要用哪個演算法呢?感謝高手解答
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.160.54.212
推 nowar100:推swon大 真強者! 10/18 02:49
推 afulist:解答真是太詳細了~ 10/18 08:02