弗洛伊德·沃沙尔的平行林克
本文关键字:林克 弗洛伊德 | 更新日期: 2023-09-27 18:29:58
我们遇到了这个Graph问题,我们需要实现Floyd-Warshall,我们做到了。尽管我们有点不喜欢这个算法,因为它非常慢。
我们想知道是否有可能在第二个循环上应用并行linq,这样我们就可以加快算法的速度
问题:使用var
i
加速For循环
private int[,] FloydWarshall(int[,] matrix)
{
var loopCount = matrix.GetLength(0);
var next = CreatePredecessorMatrix(matrix);
for (var k = 0; k < loopCount; k++)
{
for (var i = 0; i < loopCount; i++)
{
for (var j = 0; j < loopCount; j++)
{
if (matrix[i, j] > matrix[i, k] + matrix[k, j])
{
matrix[i, j] = matrix[i, k] + matrix[k, j];
next[i, j] = next[k, j];
}
}
}
}
return next;
}
用Parallel.For代替那个"var i"For循环不能实现与Parallel Linq相同的速度吗?
Viider Storm关于并行的非常好的建议
private int[,] FloydWarshall(int[,] matrix)
{
var loopCount = matrix.GetLength(0);
var next = CreatePredecessorMatrix(matrix);
for (var k = 0; k < loopCount; k++)
{
Console.WriteLine(k);
Parallel.For(0, loopCount, i =>
{
for (var j = 0; j < loopCount; j++)
{
if (matrix[i, j] > matrix[i, k] + matrix[k, j])
{
matrix[i, j] = matrix[i, k] + matrix[k, j];
next[i, j] = next[k, j];
}
}
});
}
return next;
}
感谢您的投入!