算法之「弗洛伊德(Floyd)算法」

弗洛伊德算法

弗洛伊德(Floyd)算法是 Robert W. Floyd(羅伯特·弗洛伊德)於 1962 年發表在「Communications of the ACM」上,Robert W.Floyd 在 1978 年得到了圖靈獎。用於從給定的加權圖中查找全部頂點間的最短路徑問題。做爲該算法的結果,它將生成矩陣,該矩陣將表示從任何頂點到圖中全部其餘頂點的最小距離。java

弗洛伊德算法步驟

1.根據輸入圖的二維數組初始化輸出 dist 二維數組。
2.利用中間頂點,逐個挑選全部頂點並更新全部最短路徑。
3.選擇頂點 k 做爲中間頂點時,咱們將頂點 {0,1,2,... k-1} 視爲中間頂點,i、j 表示源頂點和目標頂點。
4.若是 k 不是從 i 到 j 的最短路徑中的中間頂點,咱們保持 dist [i] [j]的值不變。
5.若是 k 是從 i 到 j 的最短路徑中的中間頂點,而且 dist[i][k] + dist[k][j] < dist[i][j],則更新 dist[i][j] = dist[i][k] + dist[k][j]。算法

弗洛伊德算法時間複雜度

因爲弗洛伊德算法使用了三層循環,因此它的時間複雜度爲 O(N^{3}),空間複雜度爲 O(N^{2})數組

弗洛伊德算法實現

public int[][] floydWarshall(int graph[][]) {
    //頂點個數
    int n = 4;
    int dist[][] = new int[n][n];
    int i, j, k;
    
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            dist[i][j] = graph[i][j];

    for (k = 0; k < n; k++) {
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                if (dist[i][k] + dist[k][j] < dist[i][j])
                    dist[i][j] = dist[i][k] + dist[k][j];
            }
        }
    }
    return dist;
}
複製代碼

總結

弗洛伊德算法的優勢是容易理解,能夠算出任意兩個頂點之間的最短距離,代碼編寫簡單。微信

缺點是時間複雜度比較高,不適合計算大量數據。spa

PS:
清山綠水始於塵,博學多識貴於勤。
我有酒,你有故事嗎?
微信公衆號:「清塵閒聊」。
歡迎一塊兒談天說地,聊代碼。code

相關文章
相關標籤/搜索