貪心演算法學習筆記

2021-10-11 00:22:34 字數 2023 閱讀 9735

貪心演算法是指在對問題求解時,總是做出在當前看來是最好的選擇。

不從整體最優上加以考慮,只做出在某種意義上的區域性最優解。

選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。

最優解問題大部分都可以拆分成乙個個的子問題,把解空間的遍歷視作對子問題樹的遍歷,則以某種形式對樹整個的遍歷一遍就可以求出最優解,大部分情況下這是不可行的。

貪心演算法和動態規劃本質上是對子問題樹的一種修剪,兩種演算法要求問題都具有的乙個性質就是子問題最優性。

動態規劃方法代表了這一類問題的一般解法,我們自底向上構造子問題的解,對每乙個子樹的根,求出下面每乙個葉子的值,並且以其中的最優值作為自身的值,其它的值捨棄。

貪心演算法是動態規劃方法的乙個特例,可以證明每乙個子樹的根的值不取決於下面葉子的值,而只取決於當前問題的狀況。

1.活動選擇問題

貪心策略應該是每次選取結束時間最早的活動。

2.錢幣找零問題

每一步盡可能用面值大的紙幣。

3.再論揹包問題

三種最基本的揹包問題:零一揹包,部分揹包,完全揹包。

這樣一種揹包問題:在選擇物品i裝入揹包時,可以選擇物品的一部分,而不一定要全部裝入揹包。這時便可以使用貪心演算法求解了。

4.多機排程問題

n個作業組成的作業集,可由m臺相同機器加工處理。要求給出一種作業排程方案,使所給的n個作業在盡可能短的時間內由m臺機器加工處理完成。作業不能拆分成更小的子作業;每個作業均可在任何一台機器上加工處理。

當n<=m時,只要將作業時間區間分配給作業即可;當n>m時,首先將n個作業從大到小排序,然後依此順序將作業分配給空閒的處理機。也就是說從剩下的作業中,選擇需要處理時間最長的,然後依次選擇處理時間次長的,直到所有的作業全部處理完畢,或者機器不能再處理其他作業為止。

5.小船過河問題

只有一艘船,能乘2人,船的執行速度為2人中較慢一人的速度,過去後還需乙個人把船划回來,問把n個人運到對岸,最少需要多久。先將所有人過河所需的時間按照公升序排序,我們考慮把單獨過河所需要時間最多的兩個旅行者送到對岸去,有兩種方式:

最快的和次快的過河,然後最快的將船划回來;次慢的和最慢的過河,然後次快的將船划回來,所需時間為:t[0]+2*t[1]+t[n-1];

最快的和最慢的過河,然後最快的將船划回來,最快的和次慢的過河,然後最快的將船划回來,所需時間為:2*t[0]+t[n-2]+t[n-1]。

每次都運送耗時最長的兩人而不影響其它人,問題具有貪心子結構的性質。

6.區間覆蓋問題

7.銷售比賽

在學校oj上做的一道比較好的題,這裡碼一下。假設有偶數天,要求每天必須買一件物品或者賣一件物品,只能選擇一種操作並且不能不選,開始手上沒有這種物品。現在給你每天的物品**表,要求計算最大收益。首先要明白,第一天必須買,最後一天必須賣,並且最後手上沒有物品。那麼除了第一天和最後一天之外我們每次取兩天,小的買大的賣,並且把賣的**放進乙個最小堆。如果買的**比堆頂還大,就交換。這樣我們保證了賣的**總是大於買的**,一定能取得最大收益。

8.huffman編碼

huffman編碼的構造方法:先合併最小頻率的2個字元對應的子樹,計算合併後的子樹的頻率;重新排序各個子樹;對上述排序後的子樹序列進行合併;重複上述過程,將全部結點合併成1棵完整的二叉樹;對二叉樹中的邊賦予0、1,得到各字元的變長編碼。

9.dijkstra演算法

演算法解決的是單個源點到其他頂點的最短路徑問題,其主要特點是每次迭代時選擇的下乙個頂點是標記點之外距離源點最近的頂點,簡單的說就是bfs+貪心演算法的思想。

10.最小生成樹演算法

設乙個網路表示為無向連通帶權圖g =(v, e) , e中每條邊(v,w)的權為c[v][w]。如果g的子圖g』是一棵包含g的所有頂點的樹,則稱g』為g的生成樹。生成樹的代價是指生成樹上各邊權的總和,在g的所有生成樹中,耗費最小的生成樹稱為g的最小生成樹。

prim演算法每一步都選擇連線u和v-u的權值最小的邊加入生成樹。

kruskal演算法每一步直接將權值最小的不成環的邊加入生成樹,我們借助並查集這一資料結構可以完美實現它。

分割陣列為連續子串行

貪心演算法思路:乙個元素優先匹配已存在的條目後面,再重新成組。

演算法學習筆記 貪心演算法

貪心也就是貪婪,就好比我們考試期末成績是由平時分和期末成績兩部分組成,我們複習時肯定是想要在考完當前這門之後的最短的時間內得到最多的分數。這就是貪心的思想。所謂貪心演算法 就是指 我們所做出的選擇在當前情況下總是最好的,它考慮的不是全域性最優解,而是 某種意義上的區域性最優解。核心思想 就是以區域性...

演算法學習筆記 貪心演算法

1 建立數學模型來描述問題 2 把求解的問題分成若干個子問題 3 對每一子問題求解,得到子問題的區域性最優解 4 把子問題的區域性最優解合併成原來解問題的乙個解。1 從問題的某一初始解出發 2 while能向給定總目標前進一步 3 求出可行解的乙個解元素 4 由所有解元素組合成問題的乙個可行解。這個...

貪心演算法學習

基本概念 所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備...