貪心演算法(Greedy Algorithm)分析

2021-07-28 23:31:48 字數 1879 閱讀 7763

貪心演算法每一步選擇完後,區域性最優解就確定了,不再進行回溯處理,也就是說,每乙個步驟的區域性最優解確定以後,就不再修改了,知道演算法結束。因為不在進行回溯處理

貪心演算法只在很少的情況下可以得到最優解,比如最短路徑問題,圖的最小生成樹問題

貪心演算法的基本設計思想有三個步驟:

建立對問題精確描述的數學模型,包括定義最優解模型;

將問題分解為一系列子問題,同時定義子問題的最優解結構;

應用貪心演算法原則確定每個子問題的區域性最優解,並根據最優解的模型,用子問題的區域性最優解堆疊出全域性的最優解

最優裝載問題

給出n個物體,第i個物體重量為wi。選擇盡量多的物體,使得總的重量不超過c。

—— 只關心數量,所以只需要將物體的重量排序,按照先裝重量小的原則來裝

部分揹包問題

有n個物體,第i個物體的重量為wi,價值為vi。在總重量不超過c的情況下讓總價值盡量高。每乙個物體都可以取走一部分,價值和重量按比例計算。

——優先拿「價值除以重量值最大的」,直到重量和為c。(由於每個物體可以只拿一部分,因此可以一定可以讓總重量恰好為c(或者全部拿走重量都不滿足c),而且除了最後乙個物體外,要麼不拿,要麼全部拿走)

乘船問題

有n個人,第i個人重量為wi,每艘船的最大載重量均為c,且最多只能乘兩個人。用最少的船載所有人。

——最輕的人應該和選擇能和他一起坐船的人中最重的乙個j。首先將資料排序,用兩個下標i和j表示最輕的和最重的,每次首先將j減一,找到能和j一起坐船的人,然後i加一,重複。且最後比j重的人只能乙個人做一艘船了,沒有最輕和他一起坐船了,此方法時間複雜度為o(n)。

選擇不相關區間

數軸上有n個開區間(ai,bi)。選擇盡量多的區間,使得這些區間兩兩沒有公共點。

——按照bi從小到大的順序給區間排序。貪心策略「一定要選擇第乙個區間。」當a1>a2選擇被包含的區間(a1,b1),當(a1小於a2小於a3),還是選擇(a1,b1),只有這樣才能節省出更多的位置來選擇更多的區間。選擇了1區間後,要把和區間1相交的區間排除在外,需要記錄上乙個被選擇的區間編號。

區間選點問題

數軸上面有n個閉區間[ai,bi]。盡量選取少的點,使得每個區間內都至少有乙個點(不同區間內含的點可以是同乙個)

——如果區間i內有乙個點被取到,則稱此區間被滿足,首先討論區間包含的情況,當小區間滿足時,大區間也一定滿足,所以在區間包含的情況下,應選擇小區間。當時其他情況下是,吧所有區間按照b從小到大順序排序(b相同時a從大到小排序),則如果出現區間包的情況,小區間一定排在前面,第乙個區間應該取那個點呢?此處的貪心的策略是:取最後乙個點。

區間覆蓋問題

數軸上有n個閉區間[ai,bi],選擇盡量少的區間覆蓋一條指定線段[s,t]。

——本題的區間仍是區間包含和排序掃瞄,不過要先經過一次預處理。每個區間在[s,t]外的部分都應該預先被切掉,因為他們存在是毫無意義的,預處理後,在相互包含的情況下,小區間顯然不應該被考慮。把個區間按照a從小到大的排序。如果區間1的起點不是s,無解(因為其他區間的起點更大,不可能覆蓋到s點),否則選擇起點在s的最長區間。選擇此區間[ai,bi]後,下乙個區間的新的起點應該設定為bi,並且忽略所有在區間bi之前的部分,就想預處理一樣,此貪心仍然只需要一次掃瞄,s為當前有效起點。

經典貪心演算法 貪心演算法概述

貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...

演算法 貪心演算法

把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...

演算法 貪心演算法

集合覆蓋問題 旅行商問題等都屬於np完全問題,在數學領域上並沒有快速得到最優解的方案,非常適合用貪婪演算法。判斷方法 1.元素較少時,一般執行速度很快,但隨著元素數量增多,速度會變得非常慢 2.涉及到需要計算比較 所有的組合 情況的通常是np完全問題 3.無法分割成小問題,必須考慮各種可能的情況。這...