算法之「弗洛伊德(Floyd)算法」
2019-05-04 本文已影响0人
清尘闲聊
弗洛伊德算法
弗洛伊德(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:
清山绿水始于尘,博学多识贵于勤。
我有酒,你有故事吗?
微信公众号:「清尘闲聊」。
欢迎一起谈天说地,聊代码。