演算法與資料結構基礎 - 分治法(Divide and Conquer)

bangerlee發表於2019-08-13

分治法基礎

分治法(Divide and Conquer)顧名思義,思想核心是將問題拆分為子問題,對子問題求解、最終合併結果,分治法用虛擬碼表示如下:

function f(input x size n)
    if(n < k)
        solve x directly and return 
    else
        divide x into a subproblems of size n/b
        call f recursively to solve each subproblem
  Combine the results of all sub-problems            

 

分治法簡單而言分三步 Divide、Conquer、Combine,圖示如下:

 

和動態規劃、貪心等一樣,分治法是一種演算法思想,不是用於解決專門某類問題的方法。折半查詢(Binary Search)、快速排序/快速選擇/歸併排序、二叉樹處理等都包含了分治法的思想。

 

關於折半查詢、快速排序/歸併排序,詳見:

演算法與資料結構基礎 - 折半查詢(Binary Search)

演算法與資料結構基礎 - 排序(Sort)

 

相關LeetCode題:

169. Majority Element  題解

53. Maximum Subarray  題解

215. Kth Largest Element in an Array  題解

426. Convert Binary Search Tree to Sorted Doubly Linked List  題解

240. Search a 2D Matrix II  題解 

218. The Skyline Problem  題解

4. Median of Two Sorted Arrays  題解 

 

快取過程結果(Memoization)

一些場景下我們會遇到相同的子問題,這時可以用雜湊表等結構快取子問題的結果,當再次遇到相同子問題時、直接返回結果即可,memoization是常用的減少計算複雜度的技巧。

 

相關LeetCode題:

241. Different Ways to Add Parentheses  題解

312. Burst Balloons  題解

 

時間複雜度

分治法中常用到遞迴,因而其時間複雜度並不直觀,關於分治法時間複雜度計算,詳見:

Advanced master theorem for divide and conquer recurrences

 

相關文章