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

2021-10-07 07:43:47 字數 1723 閱讀 5584

要想清楚兩者的區別,首先就要了解兩者的基本概念與性質。

比如中國的貨幣,只看元,有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.計數問題,如有多少種方式走到右下角,有多少種方法選出k個數使得和是sum 2.求最大最小值,如從左上角走到右下角路徑的最大數字和 3.求存在性,如取...

貪心演算法和動態規劃

貪心演算法 在求解問題時,總是做出在當前看來做好的選擇,所以它是區域性最優解,試圖通過區域性最優推出全域性最優。需要注意的是貪心演算法沒有固定的演算法框架,演算法設計的關鍵是選擇貪心策略,其必須具備無後效性,即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。常見的用貪心演算法解決的問題,比如...

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

本來這次是該總結動態規劃的,但在學習過程中發現動態規劃和上一節的貪心演算法有很大聯絡,而在演算法設計過程中主要是對兩種演算法的選擇,所以決定這次以對比的方式做總結,既可以更深入地了解動態規劃,又可以對貪心演算法有個新的認識。背景介紹 這兩種演算法都是選擇性演算法,就是從乙個候選集合中選擇適當的元素加...