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

弗洛伊德算法

弗洛伊德(Floyd)算法是 Robert W. Floyd(罗伯特·弗洛伊德)于 1962 年发表在“Communications of the ACM”上,Robert W.Floyd 在 1978 年获得了图灵奖。用于从给定的加权图中查找所有顶点间的最短路径问题。作为该算法的结果,它将生成矩阵,该矩阵将表示从任何顶点到图中所有其他顶点的最小距离。

弗洛伊德算法步骤

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]。

弗洛伊德算法时间复杂度

由于弗洛伊德算法使用了三层循环,所以它的时间复杂度为 ,空间复杂度为 。

弗洛伊德算法实现

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;
}
复制代码

总结

弗洛伊德算法的优点是容易理解,可以算出任意两个顶点之间的最短距离,代码编写简单。

缺点是时间复杂度比较高,不适合计算大量数据。

PS:
清山绿水始于尘,博学多识贵于勤。
我有酒,你有故事吗?
微信公众号:「清尘闲聊」。
欢迎一起谈天说地,聊代码。

你可能感兴趣的:(算法之「弗洛伊德(Floyd)算法」)