學習整理自北京大學 屈婉玲 算法設計與分析MOOC
1.概述
判斷依據某種“短視的”貪心選擇性質,性質的好壞決定了算法的正確性。貪心性質的選擇往往依賴於直覺或者經驗。
貪心法正確性證明方法:
- 直接計算優化函數,貪心法的解恰好取得最優值
- 數學歸納法(對算法步數或者問題規模歸納)
- 交換論證
證明貪心策略不對:舉反例
對於某些不能保證對所有的實例都得到最優解的貪心算法(近似算法),可做參數化分析或者誤差分析。
2.數學歸納法
(1)一個數學歸納法的例子
例: 證明對於任何自然數 n,1+2+...+n=n(n+1)/2
證:
n=1,左邊=1,右邊=1×(1+1)/2=1
假設對任意自然數 n 等式成立,則
1+2+...+(n+1)
=(1+2+...+n)+(n+1)
=n(n+1)/2+(n+1)
=(n+1)(n/2+1)
=(n+1)(n+2)/2
(2)第一數學歸納法
適合證明涉及自然數的命題 P(n)
歸納基礎:證明 P(1) 爲真(或 P(0) 爲真)
歸納步驟:若對所有 n 有 P(n) 爲真,證明 P(n+1) 爲真
(3)第二數學歸納法
適合證明涉及自然數的命題 P(n)
歸納基礎:證明 P(1) 爲真(或 P(0) 爲真)
歸納步驟:若對所有小於 n 的 k 有 P(k) 真,證明 P(n) 爲真
(4)兩種歸納法的區別
3.活動選擇
(1)敘述命題
算法 Select 執行到第 k 步,選擇 k 項活動 i1=1,i2,…,ik,則存在最優解 A 包含活動 i1=1,i2,…,ik。
根據上述命題:對於任何 k,算法前 k 步的選擇都將導致最優解,至多到第 n 步將得到問題實例的最優解。
(2)歸納基礎
令 S={1,2,…,n} 是活動集,且 f1≤…≤fn
歸納基礎:k=1,證明存在最優解包含活動 1
證:
任取最優解 A, A 中活動按截止時間遞增排列。如果 A 的第一個活動爲 j, j=1,用 1 替換 A 的活動 j 得到解 A′,即 A′=(A−{j})∪{1},由於 f1≤fj,A′ 也是最優解,且含有 1。
(3)歸納步驟
歸納步驟:假設命題對 k 爲真,證明對 k+1 也爲真。
證:
算法執行到第 k 步,選擇了活動 i1=1,i2,…,ik,根據歸納假設存在最優解 A 包含 i1=1,i2,…,ik,A 中剩下活動選自集合 S′
B 是 S′ 的最優解。(若不然,S′ 的最優解爲 B∗,B∗ 的活動比 B 多,那麼 B∗∪{1,i2,…,ik} 是 S 的最優解,且比 A 的活動多,與 A 的最優性矛盾。)
將 S′ 看成子問題,根據歸納基礎,存在 S′ 的最優解 B′ 有 S′ 中的第一個活動 ik+1,且 ∣B′∣=∣B∣,於是 {i1,i2,...,ik}∪B′={i1,i2,...,ik,ik+1}∪(B′−{ik+1}) 也是原問題的最優解。
4.
5.
6.哈夫曼算法
引理1:設 C 是字符集,∀c∈C,f(c) 爲頻率,x,y∈C,f(x),f(y) 頻率最小,那麼存在最優二元前綴碼使得 x,y 碼字等長,且僅在最後一位不同。
引理2:設 T 是二元前綴碼所對應的二叉樹,∀x,y∈T,x,y 是樹葉兄弟,z 是 x,y 的父親,令 T′=T−{x,y},且令 z 的頻率 f(z)=f(x)+f(y),T′ 是對應於二元前綴碼 C′=(C−{x,y})∪{z} 的二叉樹,那麼 B(T)=B(T′)+f(x)+f(y)。
7.