算法之「弗洛伊德(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

相关文章
相关标签/搜索