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

漫談算法(一):交換論證法證明貪心算法最優性

     編輯:關於C語言

作者:劉子韜

核心方法:Exchange Argument(交換論證)

證明貪心算法最優的經典技巧:假設存在最優解 O 與貪心算法 A 最接近,通過交換一個步驟/元素構造新最優解 O',使 O' 更接近 A,產生矛盾,證 A 最優。

標準證明框架(版本 1)

  1. 給出貪心算法 A 描述
  2. 假設 O 是與 A 最相似的最優解(前 k-1 步相同,第 k 步不同)
  3. 關鍵步驟:交換 A 和 O 中的某元素,構造 O'
  4. 證明 O' 可行(滿足約束條件)
  5. 證明 O' 至少與 O 一樣優(目標值不劣)
  6. 得出矛盾:O' 比 O 更接近 A,違背「最相似」假設 → A 最優

變體框架(版本 2)

  1. 給出貪心算法 A
  2. 任意選一最優解 O
  3. 找出 O 和 A 的一處不同(元素歸屬或順序)
  4. Exchange 該差異,論證新解不劣於 O
  5. 論證此類不同只有多項式個,多項式次交換後消除所有差異,得 A 最優

經典例題演示

例 1:最大基數不相交區間問題

問題:給定區間集合 T={(a₁,b₁)...(aₙ,bₙ)},找最大子集 S 使區間互不重疊。

貪心策略:每次選右端點 b 最小的區間加入 S,刪除其與所有重疊區間,重複。

證明:

  • 設 A 第 k 步選 (aᵢ,bᵢ),O 第 k 步選 (aⱼ,bⱼ),由貪心性質 bᵢ ≤ bⱼ
  • 構造 O' = O - (aⱼ,bⱼ) + (aᵢ,bᵢ)
  • 可行性:前 k-1 同 A 無重疊;bᵢ ≤ bⱼ 保證不與後續重疊
  • 最優性:|O'| = |O|,同為最優
  • 矛盾:O' 與 A 共同區間數為 k,違背假設 → A 最優

例 2:帶截止時間的調度問題

問題:n 個任務,執行時間 pᵢ,CPU 非搶佔,所有任務同時釋放,最小化平均完成時間 (Σcᵢ)/n。

貪心策略:每次選剩餘執行時間最短的任務(SPT 原則)。

證明:

  • 設 A、O 前 k-1 相同,A 第 k 選任務 i,O 第 k 選任務 j,知 pᵢ ≤ pⱼ
  • O 中任務 i 位於第 t 位(t > k)
  • 構造 O':交換 O 中位置 k 和 t 的任務
  • 計算總完成時間差:Time(O) - Time(O') = (pᵢ - pⱼ)(k - t) ≥ 0
  • 故 O' 不劣於 O,且與 A 共同前綴長度為 k → 矛盾 → A 最優

例 3:Kruskal 最小生成樹算法

問題:邊按權重排序,依序加入不形成環的邊。

證明(版本 2 框架):

  • 設 Kruskal 生成樹 T₂,任意最優解 T₁,T₁ ≠ T₂
  • 存在邊 e ∈ T₁ 但 e ∉ T₂
  • 刪除 e 將 T₁ 分為 Tₐ, T_b;T₂ 中必有邊 f 連接 Tₐ, T_b(f ≠ e)
  • Kruskal 未選 e 因形成環,且先選了 f → w(f) ≤ w(e)
  • 構造 T₃ = T₁ - e + f
  • T₃ 為生成樹(f 連通兩分量),權重 ≤ T₁(因 w(f) ≤ w(e)) → T₃ 也是 MST
  • T₃ 比 T₁ 多一條與 T₂ 相同的邊
  • 重複 n 次交換可將 T₁ 轉化為 T₂,權重不增 → T₂ 是 MST

總結

Exchange Argument 是證明貪心算法最優性的利器。核心邏輯:構造反例最優解 → 局部交換 → 保持可行性與最優性 → 逼近貪心解 → 產生矛盾。三個經典例題展示了從區間調度、任務調度到圖論的廣泛適用性。掌握此法,貪心算法證明不再是難題。

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