1. 程式人生 > >(轉)動態規劃和貪心演算法的區別

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

動態規劃和貪心演算法的區別
動態規劃和貪心演算法都是一種遞推演算法 
均有區域性最優解來推導全域性最優解 

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

動態規劃演算法: 
1.全域性最優解中一定包含某個區域性最優解,但不一定包含前一個區域性最優解,因此需要記錄之前的所有最優解 
2.動態規劃的關鍵是狀態轉移方程,即如何由以求出的區域性最優解來推導全域性最優解 
3.邊界條件:即最簡單的,可以直接得出的區域性最優解
==============================================================================
貪心演算法與動態規劃 
貪心法的基本思路:   
    
從問題的某一個初始解出發逐步逼近給定的目標,以儘可能快的地求得更好的解。當達到某演算法中的某一步不能再繼續前進時,演算法停止。   
該演算法存在問題:   
1.   不能保證求得的最後解是最佳的;   
2.   不能用來求最大或最小解問題;   
3.   只能求滿足某些約束條件的可行解的範圍。實現該演算法的過程:   
從問題的某一初始解出發;
   
while   能朝給定總目標前進一步   do   
求出可行解的一個解元素;   
由所有解元素組合成問題的一個可行解 

貪心演算法最經典的例子,給錢問題。   
比如中國的貨幣,只看元,有1元2元5元10元20、50、100   
    
如果我要16元,可以拿16個1元,8個2元,但是怎麼最少呢?   
如果用貪心算,就是我每一次拿那張可能拿的最大的。   
比如16,我第一次拿20拿不起,拿10元,OK,剩下6元,再拿個5元,剩下1元   
也就是3張   10、5、1。   
    
每次拿能拿的最大的,就是貪心。   
    
但是一定注意,貪心得到的並不是最優解,也就是說用貪心不一定是拿的最少的張數   
貪心只能得到一個比較好的解,而且貪心演算法很好想得到。   
再注意,為什麼我們的錢可以用貪心呢?因為我們國家的錢的大小設計,正好可以使得貪心演算法算出來的是最優解(一般是個國家的錢幣都應該這麼設計)。如果設計成別的樣子情況就不同了   
比如某國的錢幣分為   1元3元4元   
如果要拿6元錢   怎麼拿?貪心的話   先拿4   再拿兩個1     一共3張錢   
實際最優呢?   兩張3元就夠了   



求最優解的問題,從根本上說是一種對解空間的遍歷。最直接的暴力分析容易得到,最優解的解空間通常都是以指數階增長,因此暴力窮舉都是不可行的。
最優解問題大部分都可以拆分成一個個的子問題,把解空間的遍歷視作對子問題樹的遍歷,則以某種形式對樹整個的遍歷一遍就可以求出最優解,如上面的分析,這是不可行的。
貪心和動態規劃本質上是對子問題樹的一種修剪。兩種演算法要求問題都具有的一個性質就是“子問題最優性”。即,組成最優解的每一個子問題的解,對於這個子問題本身肯定也是最優的。如果以自頂向下的方向看問題樹(原問題作根),則,我們每次只需要向下遍歷代表最優解的子樹就可以保證會得到整體的最優解。形象一點說,可以簡單的用一個值(最優值)代表整個子樹,而不用去求出這個子樹所可能代表的所有值。
動態規劃方法代表了這一類問題的一般解法。我們自底向上(從葉子向根)構造子問題的解,對每一個子樹的根,求出下面每一個葉子的值,並且以其中的最優值作為自身的值,其它的值捨棄。動態規劃的代價就取決於可選擇的數目(樹的叉數)和子問題的的數目(樹的節點數,或者是樹的高度?)。
貪心演算法是動態規劃方法的一個特例。貪心特在,可以證明,每一個子樹的根的值不取決於下面葉子的值,而只取決於當前問題的狀況。換句話說,不需要知道一個節點所有子樹的情況,就可以求出這個節點的值。通常這個值都是對於當前的問題情況下,顯而易見的“最優”情況。因此用“貪心”來描述這個演算法的本質。由於貪心演算法的這個特性,它對解空間樹的遍歷不需要自底向上,而只需要自根開始,選擇最優的路,一直走到底就可以了。這樣,與動態規劃相比,它的代價只取決於子問題的數目,而選擇數目總為1。

相關推薦

動態規劃貪心演算法區別

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

動態規劃算法—買賣股票的最佳時機系列

blog 研究 html tails com tps www lan targe 這個題,還是有些不懂,後面研究研究https://blog.csdn.net/chenvast/article/details/78950392 https://www.cnblogs.co

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

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

動態規劃貪心演算法區別

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

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

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

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

動態規劃和貪心演算法都是一種遞推演算法 均有區域性最優解來推導全域性最優解 不同點: 貪心演算法: 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這四種

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

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

面試題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)的

NOIP2007守望者的逃離普及組T3————動態規劃貪心

題解:本題主要考查動態規劃,貪心。分析題意知:閃現一般比跑快。所以一開始用閃現,用max比較,可得答案。注意(要更新值,更新值,更新值!) 程式碼如下: #include<iostream> #include<algorithm> using namespace

動態代理模式靜態代理模式區別動態代理底層實現原理

靜態代理 靜態代理在使用時,需要定義介面或者父類,被代理物件與代理物件一起實現相同的介面或者是繼承相同父類,程式碼如下 程式碼示例: 介面:IPersonDao.java public interface IPersonDao { void update();

演算法練習1動態規劃:買賣股票的最佳時機1

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。 如果你最多隻允許完成一筆交易(即買入和賣出一支股票),設計一個演算法來計算你所能獲取的最大利潤。 注意你不能在買入股票前賣出

前端的資料結構練習11動態規劃演算法

一.動態規劃演算法 dynamic programming被認為是一種與遞迴相反的技術,遞迴是從頂部開始分解,通過解決掉所有分解出的問題來解決整個問題,而動態規劃是從問題底部開始,解決了小問題後合併為整體的解決方案,從而解決掉整個問題。 動態規劃在實現上基本遵循如下思路,根據邊界條件得到規模

ADA演算法知識動態規劃相應的問題

[How Many Paths?] You are given a map in the form of an undirected graph G = (V,E) and would like to know how many possible ways to walk (that are, pa

演算法分析與設計動態規劃

動態規劃的概念複習 每次決策依賴於當前狀態,又隨即引起狀態的轉移。一個決策序列就是在變化的狀態中產生的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。 動態規劃的思想和策略 將待求解的問題分解為若干個子問題,按順序求解子階段,前一子問題的解,為後

演算法題——Ones and ZeroesJAVA動態規劃

題目描述: In the computer world, use restricted resource you have to generate maximum benefit is what we always want to pursue. For

python常用演算法7——動態規劃,回溯法

引言:從斐波那契數列看動態規劃   斐波那契數列:Fn = Fn-1 + Fn-2    ( n = 1,2     fib(1) = fib(2) = 1) 練習:使用遞迴和非遞迴的方法來求解斐波那契數列的第 n 項   程式碼如下: # _*_coding:utf

利用 SVG CSS3 實現有趣的邊框動畫

但是 cin 有一個 orm har arr edi 下載 嘗試 原文地址 今天我們來探索一下Carl Philipe Brenner的網站上一個微妙而有趣的動畫效果。當鼠標經過網格元素時,會有一個微妙的動畫發生——網格元素變得透明,每條邊有個順時針的動畫,創造了非常好的效