弗洛伊德·沃沙尔的平行林克

本文关键字:林克 弗洛伊德 | 更新日期: 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;
    }

感谢您的投入!