第4章 貪心算法

學習整理自北京大學 屈婉玲 算法設計與分析MOOC

1.概述

判斷依據某種“短視的”貪心選擇性質,性質的好壞決定了算法的正確性。貪心性質的選擇往往依賴於直覺或者經驗。

貪心法正確性證明方法:

  1. 直接計算優化函數,貪心法的解恰好取得最優值
  2. 數學歸納法(對算法步數或者問題規模歸納)
  3. 交換論證

證明貪心策略不對:舉反例

對於某些不能保證對所有的實例都得到最優解的貪心算法(近似算法),可做參數化分析或者誤差分析。

2.數學歸納法

(1)一個數學歸納法的例子

例: 證明對於任何自然數 nn1+2+...+n=n(n+1)/21+2+...+n = n (n + 1)/2

證:

n=1n=1=1左邊=1=1×(1+1)/2=1右邊=1× (1+1)/2=1

假設對任意自然數 nn 等式成立,則

1+2+...+(n+1)1+2+...+ (n+1)

=(1+2+...+n)+(n+1)= (1+2+...+n) + (n+1)

=n(n+1)/2+(n+1)= n(n+1)/2 + (n+1)

=(n+1)(n/2+1)= (n+1) (n/2+1)

=(n+1)(n+2)/2= (n+1) (n+2)/2

(2)第一數學歸納法

適合證明涉及自然數的命題 P(n)P(n)

歸納基礎:證明 P(1)P(1) 爲真(或 P(0)P(0) 爲真)

歸納步驟:若對所有 nnP(n)P(n) 爲真,證明 P(n+1)P(n+1) 爲真

(3)第二數學歸納法

適合證明涉及自然數的命題 P(n)P(n)

歸納基礎:證明 P(1)P(1) 爲真(或 P(0)P(0) 爲真)

歸納步驟:若對所有小於 nnkkP(k)P(k) 真,證明 P(n)P(n) 爲真

(4)兩種歸納法的區別

3.活動選擇

(1)敘述命題

算法 Select 執行到第 kk 步,選擇 kk 項活動 i1=1,i2,,iki_1 = 1, i_2 , … , i_k,則存在最優解 AA 包含活動 i1=1,i2,,iki_1=1, i_2 ,…, i_k

根據上述命題:對於任何 kk,算法前 kk 步的選擇都將導致最優解,至多到第 nn 步將得到問題實例的最優解。

(2)歸納基礎

S={1,2,,n}S=\{1,2,…,n\} 是活動集,且 f1fnf_1≤…≤ f_n

歸納基礎:k=1k=1,證明存在最優解包含活動 11

證:

任取最優解 AAAA 中活動按截止時間遞增排列。如果 AA 的第一個活動爲 jjj1j ≠ 1,用 11 替換 AA 的活動 jj 得到解 AA',即 A=(A{j}){1}A' = (A−\{ j \}) ∪\{1\},由於 f1fjf_1 ≤ f_jAA' 也是最優解,且含有 11

(3)歸納步驟

歸納步驟:假設命題對 kk 爲真,證明對 k+1k+1 也爲真。

證:

算法執行到第 kk 步,選擇了活動 i1=1,i2,,iki_1=1,i_2, …, i_k,根據歸納假設存在最優解 AA 包含 i1=1,i2,,iki_1=1,i_2,…,i_kAA 中剩下活動選自集合 SS'

BBSS' 的最優解。(若不然,SS' 的最優解爲 BB^{*}BB^{*} 的活動比 BB 多,那麼 B{1,i2,,ik}B^{*}∪\{1, i_2, … , i_k \}SS 的最優解,且比 AA 的活動多,與 AA 的最優性矛盾。)

SS' 看成子問題,根據歸納基礎,存在 SS' 的最優解 BB'SS' 中的第一個活動 ik+1i_{k+1},且 B=B|B' | = |B|,於是 {i1,i2,...,ik}B={i1,i2,...,ik,ik+1}(B{ik+1})\{ i_1, i_2, ... , i_k \} ∪ B' = \{ i_1, i_2, ... , i_k , i_{k+1} \} ∪ ( B'−\{ i_{k+1}\}) 也是原問題的最優解。

4.

5.

6.哈夫曼算法

引理1:設 CC 是字符集,cC∀c∈Cf(c)f(c) 爲頻率,x,yCx, y∈Cf(x),f(y)f(x), f(y) 頻率最小,那麼存在最優二元前綴碼使得 x,yx, y 碼字等長,且僅在最後一位不同。

引理2:設 TT 是二元前綴碼所對應的二叉樹,x,yT∀ x, y∈Tx,yx, y 是樹葉兄弟,zzx,yx, y 的父親,令 T=T{x,y}T'= T − \{x, y\},且令 zz 的頻率 f(z)=f(x)+f(y)f(z)=f(x)+f(y)TT' 是對應於二元前綴碼 C=(C{x,y}){z}C'=(C−\{x, y\})∪\{z\} 的二叉樹,那麼 B(T)=B(T)+f(x)+f(y)B(T)=B(T' )+f(x)+f(y)

7.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章