貪心策略一方面是求解過程比較簡單的演算法,另一方面它又是對能適用問題的條件要求最嚴格(即適用範圍很小)的演算法。
貪心策略解決問題是按一定順序,在只考慮當前區域性資訊的情況下,就做出一定的決策,最終得出問題的解。
即:通過區域性最優決策能得到全域性最優決策
遞推也是由當前問題的逐步解決從而得到整個問題的解,依賴於資訊間本身的遞推關係,每一步不需要決策參與到演算法中,更多用於計算
遞迴常常用於分治演算法、動態規劃演算法中。
遞迴是利用大問題與其子問題間的遞推關係來解決問題的。
能採用遞迴策略的演算法一般有以下特徵:
(1)為求解規模為n的問題,設法將它分解成規模較小的問題,然後從這些小問題的解方便地構造出大問題的解
(2)並且這些規模較小的問題也能採用同樣的分解和綜合方法,分解成更小的問題,並從這些更小的問題的解構造出規模較大問題的解
(3)特別的,當規模n = 1時,能直接得解
對問題所有的解逐一嘗試,從而找出問題的真正解。一般用於決策類問題,很難找到大、小規模之間的關係,也不易對問題進行分解。
類似於列舉,通過嘗試遍歷問題各個可能解的通路,當發現此路不通時,回溯到上一步繼續嘗試別的通路。
分治一般用於較複雜的問題,必須可以逐步被分解為容易解決的獨立的子問題,這些子問題解決後,進而將它們的解「合成」,就得到較大問題的解,最終合成為總問題的解。
與貪心類似,也是通過多階段決策過程來解決問題。每個階段決策的結果是乙個決策結果序列,這個結果序列中,最終哪乙個是最優的結果,取決於以後每個階段的決策,當然每次決策結果序列都必須進行儲存。因此是「高效率,高消費的演算法」。
同時,它又與遞迴法類似,當問題不能分解為獨立的階段,卻又符合最優化原理時,就可以使用動態規劃法,通過遞迴決策過程,逐步找出子問題的最優解,從而決策出問題的解。
共同點:(1)分治法與動態規劃法實際上都是遞迴思想的運用
(2)二者的根本策略都是對問題進行分解,找到大規模與小規模的關係,然後通過解小規模的解,得出大規模的解
不同點: 適用於分治法的問題分解成子問題後,各子問題間無公共子子問題,而動態規劃法相反。
動態規劃法 = 分治演算法思想 + 解決子問題間的冗餘情況
動態規劃演算法:每一步決策得到的不是乙個唯一結果,而是一組中間結果(且這些結果在以後各步可能得到多次引用),只是每一步都使問題的規模逐步縮小,最終得到問題的乙個結果。
遞推、遞迴法:注重每一步之間的關係,決策的因素較少。遞推法是根據關係從前向後推導,從小規模問題的結論推解出大問題的解。而遞迴法是根據關係從後向前使大問題轉化為小問題,最後同樣由小規模問題的解推解出大問題的解。
蠻力策略(即列舉和遞迴回溯):
當問題找不到資訊間的相互關係、也不能將問題分解為獨立的子問題,就只有把全部解都列出來之後,才能判定和推斷出問題的解。
蠻力策略適用於規模不大的問題。
(1)列舉法:實現依賴於迴圈。所以乙個列舉法只針對乙個特定問題規模的情況,例如:八重迴圈巢狀解八皇后問題的演算法。
(2)遞迴回溯法:適用於任意指定規模的情況,例如:遞迴回溯法解n皇后問題。
用演算法策略將解決問題的過程歸結為:用演算法的基本工具「迴圈機制和遞迴機制」實現。
一般常遇到的問題分為四類:
(1)判定性問題:可用遞推法、遞迴法
(2)計算問題:可用遞推法、遞迴法
(3)最優化問題:貪心演算法、分治法、動態規劃法、列舉法
(4)構造性問題:貪心演算法、分治法、廣度優先搜尋、深度優先搜尋
演算法 列舉策略
列舉法的基本思想 列舉法的基本思想是根據提出的問題列舉所有可能狀態,並用問題給定的條件檢驗哪些是需要的,哪些是不需要的。能使命題成立,即為其解。列舉結構 迴圈 判斷語句。列舉法的條件 雖然列舉法本質上屬於搜尋策略,但是它與後面講的回溯法有所不同。因為適用列舉法求解的問題必須滿足兩個條件 可預先確定每...
演算法 列舉策略
列舉法的基本思想是根據提出的問題列舉所有可能狀態,並用問題給定的條件檢驗哪些是需要的,哪些是不需要的。能使命題成立,即為其解。列舉結構 迴圈 判斷語句。雖然列舉法本質上屬於搜尋策略,但是它與後面講的回溯法有所不同。因為適用列舉法求解的問題必須滿足兩個條件 可預先確定每個狀態的元素個數n 狀態元素a1...
演算法策略 貪心
目錄 貪心 greedy 練習1 最優裝載問題 加勒比海盜 問題 思路 實現 練習2 零錢兌換 問題 思路 實現 貪心策略中存在的問題 注意 練習3 0 1揹包 問題 思路例項分析 實現 貪心策略,也稱為貪婪策略,每一步都採取當前狀態下最優的選擇 區域性最優解 從而希望推導出全域性最優解 貪心的應用...