只選擇乙個子問題
1.快2.不能保證獲得最優解,可以作為近似解,一般,在特殊情況下可保證最優解。
3.適合於組合優化問題
貪心選擇策略(分解方案)
s = s0,c = c0; // 部分解s,候選集c
while(!complete(s)) // 解擴充套件
}c = c - ; //c中引數重新計算以及候選集調整
}
注意:實現時dist 的初始值若源點和i之間無邊,則一定要為無窮大(例如xx.max_value等),若為0,則後面會更新不了,導致結果出錯。
實現一:鄰接矩陣實現
public class greedy
public void run()
}for(int i = 0;i < m;i++)
dijkstra();
system.out.println(arrays.tostring(dist));
}public void dijkstra()else
}dist[v] = 0;
s[v] = true;
for(int i = 0;i < n;i++)
}// 加入到已找到最短路徑的點集合s中
s[u] = true;
// 若存在以j為中間節點,到源點v的最短距離變小的未找到最短距離的點,則更新距離
for(int j = 0;j < n;j++)}}
}}
}
實現二:鄰接矩陣,優先佇列實現(不知道這個方法有沒有錯就是了...)
public class greedy2
}public class node implements comparable
@override
public int compareto(node o)
if(this.dis == o.dis)
return 1;}}
priorityqueuequeue;
linkedlist list; // 表示邊的權,若沒有連線的邊則用最大值表示
boolean s; // 表示已找到最短路徑的點集合
int pre; // 最短路徑中某個點對應的前驅節點
float dist; // 從源到所有其他頂點的最短路徑
int m; // 圖中邊的條數
int n; // 圖中的點的個數
int v; // 源
public static void main(string args)
public void run()
for(int i = 0;i < m;i++)
queue.add(new node(v,0));
dijkstra();
system.out.println(arrays.tostring(dist));
}public void dijkstra()
dist[v] = 0;
s[v] = true;
while (!queue.isempty())}}
}}
描述:求無向連通帶權圖的耗費最小的生成樹(生成樹中總權值最小)
/**
* kruskal演算法+並查集
* */
public class mintree
return father[x] = find(father[x]);
}/**
* 將x和y合併在乙個集合
* @param x
* @param y
*/public void union(int x,int y)else
}public class edge implements comparable
@override
public int compareto(edge o)
}int n;
arraylistlist;
/*** 儲存結果的集合
*/arraylistres;
public static void main(string args)
public void run()
for(int i = 0;i < m;i++)
list.sort(new comparator()
return o1.cost - o2.cost;
}});
kruskal();
for(int i = 0;i < res.size();i++)
}/**
* kruskal主體
*/public void kruskal()
// 把該邊加入選擇的邊集
res.add(curedge);
union(curedge.start,curedge.end);}}
}
public class mintree2
public void run()
}for(int i = 0;i < m;i++)
prim();
system.out.println(res.tostring());
}public void prim()
lowcost[0] = 0;
for(int i = 1;i < n;i++)
}if(minp == 0)
// 加入已訪問的集合
lowcost[minp] = 0;
// 更新未找出最小邊點的集合
for(int j = 1;j < n;j++)}}
}}
演算法學習之貪心法
貪心法是在對問題進行求解時,只做出在當前情況下最好的解,即區域性最優解 而動態規劃是整體最優解 建立數學模型,來描述問題 把問題分解成若干個子問題 對每一子問題求解,得到子問題區域性最優解 把每乙個子問題的區域性最優解合併成乙個解 有n個需要在同一天使用同乙個教室的活動a1,a2,an,教室同一時刻...
演算法 貪心法
動態規劃在某一步決定優化函式的最大或者最小值時候,需要考慮子問題的優化函式值,從中選出最優的結果。貪心法 也是多不判斷,不考慮子問題的計算結果,根據當時情況採取 只顧眼前的 貪心策略決定取捨,工作量少於動態規劃很多,更具效率 可導致區域性最優化而不是全域性優化 n項活動,使用同乙個禮堂問題 si 和...
演算法 貪心法
感謝華北電力大學王墨玉老師的ppt 基礎知識 應用條件 最優子結構性質 原問題包含了其子問題的最優解 對於乙個問題可能會有不同的量度標準,選擇其中可以獲得最優解的量度標準是貪心法設計的核心問題 例題活動安排問題 可求得最優解 int greedyselector int s,int f,int a ...