230 likes | 370 Views
Ch 2. Divide and Conquer ( 各個擊破 ). Divide and Conquer. 將問題切成 (Divide) 兩個或以上較小的問題來獲得解答 (Conquer) 當中有可能牽涉到合併 (Binary search 沒有 ) 較小的問題通常是原問題的實例 需使用遞迴 (recursive). Binary Search. 將原陣列分割 (Divide) 成約一半的大小 判斷 x 屬於哪個子陣列來決定是否繼續 (Conquer) 由子陣列的解答得到整體的解答. Binary Search(recursive). 演算法 2.1.
E N D
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時間複雜度 • 平均情況時間複雜度