[資料結構]貪婪演算法(Dijkstra Algorithm)
阿新 • • 發佈:2019-01-06
下週要期末考了,好虛啊=_=
複習一波資料結構發現最後一章居然還有兩個演算法沒看
所以順道把貪婪和最小生成樹看一下~
這篇就只講貪婪演算法啦,一會再開一篇。
一、貪婪演算法簡介
貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。
通過區域性的最優解去合成最後的最優解。
二、貪婪演算法求解最短路徑演算法描述:
準備:建立兩個陣列,分別存放當前條件下的最優解和已訪問節點
1、初始化:將最優解置為無窮大,已訪問節點陣列置空,將起點的最優解置為0,並調為已訪問
2、尋找最優解:遍歷最優解陣列,找出最優解,並將該點放置到已訪問佇列中
3、更新最優解:從2中的最優解出發,對最優解陣列進行更新(如果從當前最優解出發到各個頂點的距離更優,則更新)
4、重複2.3兩步,直至待訪問佇列為空
演算法結束。
三、圖解
四、實現程式碼:
噗,程式碼不是我的,直接copy教案了
template <class Weight, int graph_size> void Digraph<Weight, graph_size> :: set_distances(Vertex source, Weight distance[]) const /* Post: The array distance gives the minimal path weight from vertex source to each vertex of the Digraph. */ { Vertex v, w; bool found[graph_size]; // Vertices found in S for (v = 0; v < count; v++) { found[v] = false; distance[v] = adjacency[source][v]; } found[source] = true; // Initialize with vertex source alone in the set S. distance[source] = 0; for (int i = 0; i < count; i++) { // Add one vertex v to S on each pass. Weight min = infinity; for (w = 0; w < count; w++) if (!found[w]) if (distance[w] < min) { v = w; min = distance[w]; } found[v] = true; for (w = 0; w < count; w++) if (!found[w]) if (min + adjacency[v][w] < distance[w]) distance[w] = min + adjacency[v][w]; } }
以上。對了,這裡還差一個如何把最短路徑的路徑輸出來還沒有解決,改天閒下來更新一下。