分支策略—分治法

分治算法的實質:把一個複雜的問題分成兩個或更多的相同或相似的子問題,直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。

在這裏插入圖片描述

分治算法通常以數學歸納法來驗證。而它的計算成本則多數以解遞歸關係式來判定。

分治法模式在每一層遞歸時都有三個步驟

  1. 分解原問題爲若干子問題,都是原問題的規模較小的實例。
  2. 解決這些子問題,遞歸求解子問題,如果子問題足夠小,直接求解。
  3. 合併這些子問題的解變成原問題的解。
    有時候,除了求解與原問題形式完全一樣的規模更小的子問題外,還需要求解與原問題不完全一樣的子問題,將這些子問題的求解看作合併步驟的一部分。

分析分治算法
分析算法運行時間的遞歸式來自基本模式的三個步驟,假設T(n)是規模爲n的一個問題的運行時間。如果問題規模足夠小,n<=c,則直接求解需要常量時間,我們寫做Θ(1),假設把原問題分解爲a個子問題,每個子問題的規模爲原問題的1/b,爲了求解一個規模是n/b的子問題,需要T(n/b),a個子問題需要a*T(n/b)時間,如果分解問題需要時間D(n),合併子問題的解成原問題的解需要時間C(n),那麼可以得到遞歸式:

  1. T(n)=Θ(1) 如果n<=c;
  2. T(n)=aT(n/b)+D(n)+C(n) 其他
    遞歸式可以有很多形式,不一定是把原問題分解爲相同規模的子問題。
    這裏介紹一種求解遞歸式的方法
    主方法
    即是T(n)=aT(n/b)+D(n)+C(n)又可以寫成T(n)=aT(n/b)+f(n),含義是將原問題分解爲a個子問題,規模減小爲原來的1/b,分解和合並花費時間f(n)。

下面是我收集的利用了分治算法的實例
1.歸併排序
2. 最大子數組問題 3. 矩陣乘法的Strassen算法