首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

漫談算法(四):分治算法遞歸式求解三大法——數學歸納法、遞歸樹、主定理

     編輯:關於C語言

作者:劉子韜

分治算法定義

基於多分支遞歸的算法設計範式:將問題遞歸分解為同類子問題,直到足夠簡單直接求解,再合併子問題解得到原問題解。

核心兩步走

  1. 建立遞歸式:描述問題規模 n 與子問題規模關係
  2. 求解遞歸式:得到時間複雜度閉式解

例:T(n) = 4T(n/2) + n


三大求解方法

方法一:數學歸納法

核心:猜測答案形式 → 數學歸納證明

例題:T(n) = T(n/2) + T(n/4) + T(n/8) + n

猜測:T(n) = Θ(n)

證明 Ω(n):T(n) > n 顯然成立

證明 O(n):假設 T(n) ≤ cn

T(n) ≤ c·n/2 + c·n/4 + c·n/8 + n = (7c/8 + 1)n
令 (7c/8 + 1)n ≤ cn → c ≥ 8 成立

∴ T(n) = Θ(n)

猜測直覺來源:遞歸樹觀察

每層總代價遞減,頂層 n 主導 → 猜測 Θ(n)

兩個猜測小技巧

  1. T(n) = aT(n/b + d) + f(n) 中,n 足夠大時 d 可忽略
  2. 歸納假設可加常數項:T(n) ≤ cn - d,消除常數干擾

方法二:遞歸樹法

核心:畫樹 → 按層求和 → 幾何級數求和

通用遞歸式:T(n) = aT(n/b) + nᵏ

樹高 h = logbn

第 i 層:aⁱ 個節點,每節點代價 (n/bⁱ)ᵏ = nᵏ/bⁱᵏ

第 i 層總代價:aⁱ · nᵏ/bⁱᵏ = nᵏ · (a/bᵏ)ⁱ

總代價:Σi=0h-1 nᵏ(a/bᵏ)ⁱ + 葉子代價

不平衡遞歸樹高度計算

T(n) = T(n/3) + T(2n/3) + O(n)

最長分支決定高度:n → (2/3)n → (2/3)²n → ... → 1

高度 k 滿足 (2/3)ᵏn = 1 → k = log3/2n


方法三:主定理

適用形式:T(n) = aT(n/b) + f(n),a ≥ 1, b > 1

三大情況

  1. f(n) = O(nlogba - ε) → T(n) = Θ(nlogba)
  2. f(n) = Θ(nlogba logkn) → T(n) = Θ(nlogba logk+1n)
  3. f(n) = Ω(nlogba + ε) 且正則條件 → T(n) = Θ(f(n))

使用建議

  • 條件滿足直接套用結論
  • 不滿足時退回遞歸樹或歸納法
  • 掌握證明邏輯有助於處理變體遞歸式

總結

分治算法遞歸式求解三板斧:數學歸納法靠猜測+嚴證,遞歸樹法靠畫圖+求和,主定理靠套用+分情況。實戰中常結合使用:遞歸樹輔助猜測,歸納法嚴格證明,主定理快速驗證。掌握三法遞歸式分析不再是難題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved