在計算機科學中,貪心演算法(Greedy Algorithm)也叫貪婪演算法,是指在對問題求解時,總是做出在當前看來最好的選擇,不追求最優解,快速高效完成問題求解。在有些情況下,貪心演算法能得到全局最優解或者是局部最優解。
一、演算法基礎
貪心演算法是一種基於貪心思想的演算法策略,在每個階段選擇最優解,從而達到全局最優解的策略。貪心演算法是一種較為簡單的演算法設計策略,具有易於理解、簡單、易於證明其正確性等優點。貪心演算法與動態規劃演算法、回溯演算法等常用演算法比較類似。
具體地說,應用貪心演算法的問題分為以下幾步:
1. 定義最優解的結構,並遞歸地定義其最優性。
2. 構造一個包含所求問題的所有可行解的集合。
3. 證明這個集合為空,或者這個集合只是某些最優解的子集而非最優解集合。
4. 設計一個演算法,在可行解集合中選擇和最優解有關的解,並遞歸地構造最優解。
5. 證明演算法構造的最優解是最優解。
二、應用場景
貪心演算法通常適用於滿足貪心選擇屬性的問題,並且貪心選擇屬性能夠推導出全局最優解的問題,例如最小生成樹、最短路徑問題等。在一些特殊情況下,貪心演算法也能得到全局最優解,例如哈夫曼編碼等。
三、代碼實現
貪心演算法在Prim最小生成樹問題中的應用
#include using namespace std; typedef long long ll; typedef pair pii; const int MAXN = 1e5 + 10; const ll INF = 0x3f3f3f3f3f3f3f3f; int n, m, s; ll dis[MAXN]; bool vis[MAXN]; vector g[MAXN]; void prim(int s) { memset(dis, 0x3f, sizeof dis); dis[s] = 0; priority_queue<pii, vector, greater> q; q.push({ 0, s }); ll ans = 0; while (!q.empty()) { pii t = q.top(); q.pop(); int u = t.second; vis[u] = true; if (dis[u] != t.first) continue; ans += dis[u]; for (auto& e : g[u]) { int v = e.first, w = e.second; if (!vis[v] && w < dis[v]) { dis[v] = w; q.push({ dis[v], v }); } } } cout << ans <> n >> m >> s; for (int i = 0; i > u >> v >> w; g[u].emplace_back(v, w); g[v].emplace_back(u, w); } prim(s); return 0; }
貪心演算法在Dijkstra最短路徑問題中的應用
#include using namespace std; typedef long long ll; typedef pair pli; const int MAXN = 1e5 + 10; const ll INF = 0x3f3f3f3f3f3f3f3f; int n, m, s; ll dis[MAXN]; bool vis[MAXN]; vector g[MAXN]; void dijkstra(int s) { memset(dis, 0x3f, sizeof dis); dis[s] = 0; priority_queue<pli, vector, greater> q; q.push({ 0, s }); while (!q.empty()) { pli t = q.top(); q.pop(); int u = t.second; vis[u] = true; if (dis[u] != t.first) continue; for (auto& e : g[u]) { int v = e.second; ll w = e.first; if (!vis[v] && dis[u] + w < dis[v]) { dis[v] = dis[u] + w; q.push({ dis[v], v }); } } } for (int i = 1; i <= n; i++) cout << dis[i] << " "; cout <> n >> m >> s; for (int i = 0; i > u >> v >> w; g[u].emplace_back(w, v); } dijkstra(s); return 0; }
四、結語
貪心演算法作為一種基本的演算法策略,具有易於理解、易於實現和快速高效的特點,在實際的演算法設計和問題求解中都有廣泛的應用。但是,貪心演算法存在一些問題,例如貪心選擇並不總能推導出全局最優解等。
綜上所述,貪心演算法在實際應用中需要結合具體問題,進行適當的分析和考慮,並利用必要的技巧和策略才能夠更好地解決問題。通過不斷地學習和實踐,才能不斷提升自己的演算法設計和問題求解能力。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/283143.html