年齡增長所帶來的成熟與經驗,不值得誇耀。
貪婪,是一種本性。無後效性的貪婪,稱為貪心演算法;而全域性貪婪,則稱為動態規劃。那麼,貪心和動歸的具體思想是什麼?分別又是如何實現的?
貪心演算法(greedy algorithm),是一種在每一步選擇中都採取當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是最好或最優的演算法。其在有最優子結構問題中尤為有效,最優子結構的意思是區域性最優解能決定全域性最優解。
舉個例子直觀感受一下:超級書架。
題目描述:給你n個高度分別為hi的物體,和乙個高度為b的書架,並且保證這些物體的高度之和大於等於書架的高度b。問從這n個物體中最少要取出多少個,使得這些取出來的物體所堆起來的總高度不小於書架的高度b。
解法:此題具備無後效性,是一道典型的貪心演算法題。無後效性是指某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。因此每次我們只需選取剩餘最高的物體,直到高度之和超過書架為止即為答案。
動態規劃(dynamic programming)是解決多階段最優化問題的一種思想方法。動態規劃的關鍵是動態轉移方程,很多情況下其編碼實現非常簡單。基本實現方法可分為如下兩步:
遞推由當前狀態推導後面的狀態,更加強調階段性。
遞迴記憶化搜尋,由前面狀態得出當前狀態,一般承認階段性。
同樣,我們還是通過舉例子來直觀感受,不妨就舉乙個與超級書架相似的例子:揹包問題。
題目描述:乙個容量為m的揹包,現在有n個體積為ni的物品,如何裝包才能讓揹包容量的利用率最大?
分析:由於此題不滿足「無後效性」,因此如果按照貪心策略裝包,很有可能得不到最優解。比如對於容量為10的揹包,假設有5個體積依次為(6, 5, 3, 3, 2)的物品,貪心策略會從大到小裝包,因此體積為6和3的物品被選出,揹包容量利用率為90%。但最優的策略應該是將體積為5、3和2的物品裝包,此時利用率能達到100%。此時則不能用貪心演算法,而需要用動態規劃來解。
解法:此題是乙個典型的簡化版01揹包問題,動態轉移方程為:f(m) = f(m - k)。其中m為當前計算的容量,0 < m <= m,k為每個物品的體積。外層迴圈遍歷物體體積,內層迴圈從大到小遍歷揹包容量。這裡多說一句,如果是重複揹包問題(每種物品可取多次),內層迴圈則需改為從小到大遍歷揹包容量。
典型的動態規劃問題還有飛彈攔截、字串距離和最長公共子串行等。敬請期待下節內容最短路。
演算法基礎 列舉 遞迴 動歸 深廣搜 二分 貪心
筆記內容 課程 概念 很多情況下列舉意味著使用迴圈 一般性 完備性 分析原子 區域性 整體 技巧 概念 分析 技巧 性質 分析 確定狀態 確定初始 邊界狀態的值 確定狀態轉移方程 技巧 比較 技巧 技巧 分析 設定冗餘陣列 使用乙個自增變數進行序列列舉 壓縮多個01狀態至單個變數 剪枝 優先進行列舉...
演算法設計與分析基礎3 貪心演算法
遞迴與分治演算法動態規劃貪心演算法回溯演算法貪心演算法的特徵是最優子結構性質和貪心選擇性質。最優子結構性質 原問題的最優解包含著子問題的最優解。貪心選擇性質 問題整體的最優解是通過一系列區域性的最優選擇得到的,這種選擇叫做貪心選擇。貪心選擇可以依賴於已經做過的選擇,但是絕對不會依賴於將來的選擇,也不...
演算法設計與分析入門篇 貪心法3
課程排程 題目內容 有 n 個人,要完成 2 門課程。其中第 i 個人學習一門課程所需要的時間是 ti。每個人同一時刻只能修一門課程,每門課程同一時刻只能被乙個人修,中間不能中斷。問所有人都修完 2 門課程,至少需要多少時間。輸入格式 輸入的第一行包含乙個整數 n 1 n 1000000 接下來的一...