Ch 2 Divide and Conquer (各個擊破) Divide and Conquer     將問題切成(Divide)兩個或以上較小的問 題來獲得解答(Conquer) 當中有可能牽涉到合併(Binary search沒 有) 較小的問題通常是原問題的實例 需使用遞迴(recursive) Binary Search    將原陣列分割(Divide)成約一半的大小 判斷x屬於哪個子陣列來決定是否繼續 (Conquer) 由子陣列的解答得到整體的解答.

Download Report

Transcript Ch 2 Divide and Conquer (各個擊破) Divide and Conquer     將問題切成(Divide)兩個或以上較小的問 題來獲得解答(Conquer) 當中有可能牽涉到合併(Binary search沒 有) 較小的問題通常是原問題的實例 需使用遞迴(recursive) Binary Search    將原陣列分割(Divide)成約一半的大小 判斷x屬於哪個子陣列來決定是否繼續 (Conquer) 由子陣列的解答得到整體的解答.

Ch 2
Divide and Conquer
(各個擊破)
Divide and Conquer




將問題切成(Divide)兩個或以上較小的問
題來獲得解答(Conquer)
當中有可能牽涉到合併(Binary search沒
有)
較小的問題通常是原問題的實例
需使用遞迴(recursive)
Binary Search



將原陣列分割(Divide)成約一半的大小
判斷x屬於哪個子陣列來決定是否繼續
(Conquer)
由子陣列的解答得到整體的解答
Binary Search(recursive)

演算法2.1
Binary Search(recursive)
W(n)=W(n/2)+1
W(1)=1



如果n為2的乘冪
利用數學歸納法可以證明
W(n)=lgn+1 (p.B-4)
如果n不為2的乘冪
W(n)=lgn+1
分割到最小就可以得到解答
(lgn)
不需要再做合併的動作
合併排序Merge Search



將原陣列分割(Divide)成較小的陣列
將子陣列排序後再合併就可以得到完整
排序的陣列
由子陣列的解答得到整體的解答
合併排序Merge Search

P2-10
合併排序Merge Search



演算法p2-9
Mergesort遞迴
Merge合併
合併排序Merge Search

p2-12
合併排序Merge Search

演算法p2-11
Merge時間複雜度



先分析合併複雜度
只考慮比較指令時
W(h,m)=h+m-1
MergeSort時間複雜度

W(n)=W(h)+W(m)+(h+m-1)
W(n)=2W(n/2)+n-1
W(1)=0



W(n)=nlgn-(n-1) (nlgn)
空間複雜度=2n
使用演算法2.4可以維持空間複雜度= n
MergeSort2 & Merge2

演算法2.4
MergeSort2 & Merge2

演算法2.5
Divide and Conquer Skill



分割(Divide)一個較大問題實例成為一個
或多個較小的實例
解出每個較小實例的答案(Conquer),除
非實例已經分割到足夠小,否則使用遞
迴(Recursive)來解
必要的話,將兩個較小實例的解答合併
(Combine)以獲得原始問題的解答
快速排序Quick Search



Hoare,1962
利用樞紐值(pivot)切割
排序子陣列
快速排序Quick Search

P2-18
快速排序Quick Search

P2-19 quicksort
快速排序Quick Search

P2-20 partition
快速排序Quick Search

P2-21
Partition複雜度



所有情況時間複雜度
計算比較運算
T(n)=n-1
Quick Search時間複雜度

最差情況是碰到一個已經排序好的陣列
T(n)=T(0)+T(n-1)+(n-1)
T(0)=0


T(n)=n(n-1)/2 (n2)
不會比交換排序法快 (n2)
Quick Search時間複雜度

平均情況時間複雜度