演算法學習 貪心法

2021-09-03 02:21:24 字數 2851 閱讀 9391

只選擇乙個子問題

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 ...