1. 程式人生 > >動態規劃和貪心演算法的比較

動態規劃和貪心演算法的比較

動態規劃和貪心演算法都是一種遞推演算法 均有區域性最優解來推導全域性最優解 不同點: 貪心演算法: 1.貪心演算法中,作出的每步貪心決策都無法改變,因為貪心策略是由上一步的最優解推導下一步的最優解,而上一部之前的最優解則不作保留。2.由(1)中的介紹,可以知道貪心法正確的條件是:每一步的最優解一定包含上一步的最優解。動態規劃演算法: 1.全域性最優解中一定包含某個區域性最優解,但不一定包含前一個區域性最優解,因此需要記錄之前的所有最優解2.動態規劃的關鍵是狀態轉移方程,即如何由以求出的區域性最優解來推導全域性最優解3.邊界條件:即最簡單的,可以直接得出的區域性最優解==============================================================================

貪心演算法與動態規劃 貪心法的基本思路:   從問題的某一個初始解出發逐步逼近給定的目標,以儘可能快的地求得更好的解。當達到某演算法中的某一步不能再繼續前進時,演算法停止。   該演算法存在問題:   1.   不能保證求得的最後解是最佳的;2.   不能用來求最大或最小解問題;3.   只能求滿足某些約束條件的可行解的範圍。實現該演算法的過程:從問題的某一初始解出發;while   能朝給定總目標前進一步   do   求出可行解的一個解元素;   由所有解元素組合成問題的一個可行解 貪心演算法最經典的例子,給錢問題。   比如中國的貨幣,只看元,有125102050100   如果我要16元,可以拿
161元,82元,但是怎麼最少呢?
如果用貪心算,就是我每一次拿那張可能拿的最大的。   比如16,我第一次拿20拿不起,拿10元,OK,剩下6元,再拿個5元,剩下1也就是3   1051每次拿能拿的最大的,就是貪心。   但是一定注意,貪心得到的並不是最優解,也就是說用貪心不一定是拿的最少的張數   貪心只能得到一個比較好的解,而且貪心演算法很好想得到。   再注意,為什麼我們的錢可以用貪心呢?因為我們國家的錢的大小設計,正好可以使得貪心演算法算出來的是最優解(一般是個國家的錢幣都應該這麼設計)。如果設計成別的樣子情況就不同了   比如某國的錢幣分為   134如果要拿6元錢怎麼拿?貪心的話
先拿4   再拿兩個1     一共3張錢
實際最優呢?   兩張3元就夠了求最優解的問題,從根本上說是一種對解空間的遍歷。最直接的暴力分析容易得到,最優解的解空間通常都是以指數階增長,因此暴力窮舉都是不可行的。最優解問題大部分都可以拆分成一個個的子問題,把解空間的遍歷視作對子問題樹的遍歷,則以某種形式對樹整個的遍歷一遍就可以求出最優解,如上面的分析,這是不可行的。貪心和動態規劃本質上是對子問題樹的一種修剪。兩種演算法要求問題都具有的一個性質就是子問題最優性。即,組成最優解的每一個子問題的解,對於這個子問題本身肯定也是最優的。如果以自頂向下的方向看問題樹(原問題作根),則,我們每次只需要向下遍歷代表最優解的子樹就可以保證會得到整體的最優解。形象一點說,可以簡單的用一個值(最優值)代表整個子樹,而不用去求出這個子樹所可能代表的所有值。動態規劃方法代表了這一類問題的一般解法。我們自底向上(從葉子向根)構造子問題的解,對每一個子樹的根,求出下面每一個葉子的值,並且以其中的最優值作為自身的值,其它的值捨棄。動態規劃的代價就取決於可選擇的數目(樹的叉數)和子問題的的數目(樹的節點數,或者是樹的高度?)。貪心演算法是動態規劃方法的一個特例。貪心特在,可以證明,每一個子樹的根的值不取決於下面葉子的值,而只取決於當前問題的狀況。換句話說,不需要知道一個節點所有子樹的情況,就可以求出這個節點的值。通常這個值都是對於當前的問題情況下,顯而易見的最優情況。因此用貪心來描述這個演算法的本質。由於貪心演算法的這個特性,它對解空間樹的遍歷不需要自底向上,而只需要自根開始,選擇最優的路,一直走到底就可以了。這樣,與動態規劃相比,它的代價只取決於子問題的數目,而選擇數目總為1

動態規劃(DP)與貪心演算法(Greedy Algorithm):

1.應用動態規劃可解決的問題具有的性質是:最優子結構和重疊子問題。

    最優子結構:如果一個問題的最優解包含其子問題的最優解,我們就稱此問題具有最優子結構性質。

    重疊子問題:在求解過程中如果遞迴演算法反覆求解相同的子問題,就稱最優化問題具有重疊子問題的性質。這個地方說的是適合用遞迴演算法求解的原問題在求解過程中待分解的子問題的集合是固定的。

    應用貪心演算法可解決的問題具有的性質是:貪心選擇性質和最優子結構。

    貪心選擇性質:可以通過做出區域性最優解來構造全域性最優解。

    最優子結構:如果一個問題的最優解包含其子問題的最優解,我們就稱此問題具有最優子結構性質。

2.動態規劃和貪心演算法的相似之處

    可解決的問題都必須具有最優子結構的性質。

3.不同之處

    動態規劃首先尋找子問題的最優解,然後在其中進行選擇出一個最優解;

    貪心演算法則是首先做出一次貪心選擇-----在當時看起來是最優的選擇,然後求解選出的子問題,為不必費心的求解所有可能相關的子問題。

    在貪心演算法中,我們總是做出當時看起來最佳的選擇,然後選出的唯一子問題,而動態規劃是在求解之後的子問題選擇出最好的那個子問題。

    貪心演算法進行選擇時可能依賴之前做出的選擇,但不依賴任何將來的選擇或是子問題的解。

0--1揹包是動態規劃可解決的問題,0--1分數揹包是貪心演算法解決的問題。

相關推薦

動態規劃貪心演算法比較

動態規劃和貪心演算法都是一種遞推演算法 均有區域性最優解來推導全域性最優解 不同點: 貪心演算法: 1.貪心演算法中,作出的每步貪心決策都無法改變,因為貪心策略是由上一步的最優解推導下一步的最優解,而

動態規劃貪心演算法之揹包問題理解

一.揹包問題 引用書上關於0-1揹包和部分揹包的闡述: 二.貪心與動態規劃區別 關於紅色矩形部分解釋為什麼0-1不能使用貪心演算法,是因為當你選擇一個物品時,整個物品的大小都需要計算,然而揹包的的大小又是固定的,那麼剩下的揹包大小與剩下的物品之間

動態規劃貪心演算法的區別

不同點: 貪心演算法: 1.貪心演算法中,作出的每步貪心決策都無法改變,因為貪心策略是由上一步的最優解推導下一步的最優解,而上一部之前的最優解則不作保留。 2.由(1)中的介紹,可以知道貪心法正確的條件是:每一步的最優解一定包含上一步的最優解。

從最短路徑談動態規劃貪心演算法

一言以蔽之:動態規劃,從全域性最優考慮;最短路徑,從當前最優考慮。 先考慮下面的圖 可以很容易地看出,如果使用貪心演算法,從a到e的路線將是:a->b->c->d->e,而採用動態的規劃的路線則是:a->c->e。 貪心演算法的優點是程

再論動態規劃貪心演算法

      個人感覺貪心演算法是一個尋找規律的過程,事實上這種規律有時候是很難找到的,並且還面臨一個重大的問題是我們找的規律(一個極值解)並不一定是最值解,需要推理證明極值等於最值。     而動態規劃是一個尋找子問題的過程,有點類似分制演算法,但是動態規劃重在去掉重複的子問

(轉)動態規劃貪心演算法的區別

動態規劃和貪心演算法的區別動態規劃和貪心演算法都是一種遞推演算法 均有區域性最優解來推導全域性最優解 不同點: 貪心演算法: 1.貪心演算法中,作出的每步貪心決策都無法改變,因為貪心策略是由上一步的最優解推導下一步的最優解,而上一部之前的最優解則不作保留。 2.由(1)中的介紹,可以知道貪心法正確的條件是:每

劍指offer(面試題14): 動態規劃貪心演算法求解最優化問題

題目 給定一長為n的繩子,要求把繩子剪成m段(m,n都是整數且n>1,m>1),每段繩子的長度記為k[0], k[1], k[2]…,k[m]。請問k[0]*k[1]*k[2]….*k[m]可能的最大乘積是多少?例如,當繩子的長度是8時,可以剪成2

JavaScript演算法模式——動態規劃貪心演算法

動態規劃   動態規劃(Dynamic Programming,DP)是一種將複雜問題分解成更小的子問題來解決的優化演算法。下面有一些用動態規劃來解決實際問題的演算法: 最少硬幣找零   給定一組硬幣的面額,以及要找零的錢數,計算出符合找零錢數的最少硬幣數量。例如,美國硬幣面額有1、5、10、25這四種

面試題14:剪繩子(動態規劃貪心演算法

一、題目: 一根長度為n的繩子,剪成m段,m,n都大於1,且都為整數,每段長度記為k[0],k[1]…,k[m].求k[0]*k[1]…*k[m]可能的最大乘積 1.1解法: 兩種不同的方法解決這個問題,先用常規的需要O(n²)時間和O(n)空間的動態規劃,接著用只需要O(1)的

動態規劃貪心演算法

貪心演算法: 典型的應用有Huffman樹,直接構造兩個最小的連續相加,得到目標樹。 目標函式f=sum(li*wi);就是權重乘以葉節點的深度求和再求最小值。 如果目標函式修改為f=sum(li+wi)或max(li+wi)或任意函式g(li,wi),是否可以求解呢?

動態規劃or貪心演算法--剪繩子/切割杆

需求一: 剪繩子,將長度為n的繩子剪成若干段,求各段長度乘積的最大值分析: 1、動態規劃    設f(n)代表長度為n的繩子剪成若干段的最大乘積,如果第一刀下去,第一段長度是i,那麼剩下的就需要剪n-i,那麼f(n)=max{f(i)f(n-i)}。而f(n)的最優解對應著f

遞迴、分治策略、動態規劃以及貪心演算法之間的關係

引言 最近集中研究計算智慧,其中涉及到遞迴和動態規劃,動態規劃實現中又用到了遞迴,忽然發現這兩個概念的差別分得不太清楚。索性把遞迴、分治策略、動態規劃、貪婪選擇之間的聯絡與區別都一併搞清楚吧。 1、分治策略(Divide and Conquer)

分治法,動態規劃貪心演算法區別

轉自:http://hxrs.iteye.com/blog/1055478 分治法,動態規劃法,貪心演算法這三者之間有類似之處,比如都需要將問題劃分為一個個子問題,然後通過解決這些子問題來解決最終問題。但其實這三者之間的區別還是蠻大的。 1.分治法     分治法(di

動態規劃貪心演算法的區別

本來這次是該總結動態規劃的,但在學習過程中發現動態規劃和上一節的貪心演算法有很大聯絡,而在演算法設計過程中主要是對兩種演算法的選擇,所以決定這次以對比的方式做總結,既可以更深入地瞭解動態規劃,又可以對

六中常用演算法設計:窮舉法、分治法、動態規劃貪心法、回溯法分支限界法

演算法設計之六種常用演算法設計方法 1.直接遍歷態(窮舉法)        程式執行狀態是可以遍歷的,遍歷演算法執行每一個狀態,最終會找到一個最優的可行解;適用於解決極小規模或者複雜度線性增長,而線

動態規劃分治法,貪心算法以及遞歸的再一次深刻理解體會

規劃 動態 分治法 每次體會算法都有新的感覺,刷題越多,對算法的理解感覺也就越深刻。下面我們來重新體會下分治法,動態規劃,貪心法,遞歸的理解。1.分治法: 將問題分成單獨的階段,每個階段互相不幹擾很獨立,如10米長的木棍,切成10段,每段去解決每一段的問題。(階段沒有關系)2.貪心法 站

演算法】leetcode演算法筆記:二叉樹,動態規劃回溯法

前言 寫的比較匆忙,測試用例是能全部跑通的,不過考慮記憶體和效率的話,還有許多需要改進的地方,所以請多指教 在二叉樹中增加一行 題目描述 給定一個二叉樹,根節點為第1層,深度為 1。在其第 d 層追加一行值為 v 的節點。 新增規則:給定一個深度值 d (正整數),針對深度為 d-1 層的每一非

ALGO-13 攔截導彈(動態規劃貪心))

gpo namespace cst 雷達 高度 lan 一個 int post 問題描述   某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到

[bzoj4282]慎二的隨機數列_動態規劃_貪心

else 註釋 競賽 define ostream div sum highlight efi 慎二的隨機數列 bzoj-4282 題目大意:一個序列,序列上有一些數是給定的,而有一些位置上的數可以任意選擇。問最長上升子序列。 註釋:$1\le n\le 10^5$。

動態規劃-為sum的方法數

給定一個有n個正整數的陣列A和一個整數sum,求選擇陣列A中部分數字和為sum的方案數。 當兩種選取方案有一個數字的下標不一樣,我們就認為是不同的組成方案。  輸入描述: 輸入為兩行:  第一行為兩個正整數n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)&n