貪心演算法之近似演算法(格雷厄姆演算法)初識

2021-12-29 23:43:52 字數 934 閱讀 3316

之前做了很多貪心演算法,他們都能找到最優解,這也是之所以用貪心演算法的原因。貪心演算法較之其他,最大的優勢體現在時間複雜度低,空間複雜度也比較低。對於試用貪心演算法的題型,

有兩個重要特徵:貪心策略與最優子結構。貪心策略即每步採取策略的依據;最優子結構則是指問題的求解可以轉化為求解子問題的最優解。這點與動態規劃有點像,但後者要列舉問題的解空

間,資源消耗很大。

貪心演算法不一定保證得到最優解,但很多時候用其他方法的無效(有的是確實沒有解決方法,有的是複雜度難以接受),在這種情況下我們可以嘗試用近似演算法,根據一定的有效貪心策略,

哪怕得不到最優解,但權衡之下也是可以接受的。

例如給定若干物品,要求盡可能的將它們分成質量相近的兩堆。如物品數為5,重量分別為3,3,2,2,2,很容易根據經驗判斷分成3+3和2+2+2的兩堆。但這是乙個2^n級難題,資料量一大就出

現組合**。解決該問題目前還沒有無有效的方法。列舉法可以得到最優解,但時間複雜度為o(2^n),難以接受。下面是n<=15時的列舉法,用位操作簡化計算。

#include

#include

using namespace std;

const int maxn=20;

int w[maxn];

int used[maxn];

const int inf=1<<30;

int n,id,sum;

int solve()

else b+=w[i]; }}

int main()

{ cin>>n;

memset(used,0,sizeof(used));

for(int i=0;i>w[i];

solve();

printf("\n第一堆為:");

for(int i=0;i執行結果為:2+2+3=7 2+3=7

在有些情況下是完全可以接受近似演算法的。

近似演算法 貪心演算法與近似演算法

1.1 教室排程問題 假設有如下課程表,你希望將盡可能多的課程安排在某間教室上。你沒法讓這些課都在這間教室上,因為有些課的上課時間有衝突。你希望在這間教室上盡可能多的課。如何選出盡可能多且時間不衝突的課程呢?這個問題好像很難,不是嗎?實際上,演算法可能簡單得讓你大吃一驚。具體做法如下。1 選出結束最...

格雷厄姆演算法講解

格雷厄姆演算法是找到點堆的最小凸包演算法 學習格雷厄姆演算法,需要你掌握兩個知識點 1.角排序 2.叉積 首先在一堆點裡選乙個點作為原點 我的選擇方式是橫座標最小或者縱座標最小,因為橫縱座標取極值的情況一定是在凸包上的,自己理解 把這個點記做點o 然後把所有的點與o連線,根據所有線與水平線的夾角排序...

貪心演算法之prim演算法

演算法思想 首先置s 然後只要s是v的真子集,就做如下的貪心選擇 選擇滿足條件i屬於s,j屬於v s,且edge i j 是最小的邊,就將其頂點j新增到s中,這個過程一直進行到s v時為止,在這個過程中,選取到的所有邊恰好構成g的一顆最小生成樹。include define infinity 500...