加速C#中大数据的循环

时间:2013-04-17 12:25:13

标签: c# loops

我有三个从零到n的嵌套循环。 n是一个大数,大约12000th这三个循环在2DList上工作。它实际上是一个Floyd算法。在这些大数据中,它需要时间,你能告诉我如何改进它吗?谢谢(抱歉我的英文:))

 List<List<int>> distance = new List<List<int>>();

 ...

  for (int i = 0; i < n; i++)

        for (int v = 0; v < n; v++)

            for (int w = 0; w < n; w++)
            {
                if (distance[v][i] != int.MaxValue &&
                    distance[i][w] != int.MaxValue)
                {
                    int d = distance[v][i] + distance[i][w];
                    if (distance[v][w] > d)
                        distance[v][w] = d;
                }

            }

5 个答案:

答案 0 :(得分:3)

if语句distance[v][i] != int.MaxValue的第一部分可以移到w之外的迭代之外,以减少某些情况下的开销。但是,我不知道你的值在int.MaxValue

的频率

答案 1 :(得分:2)

你无法改变Floyd的算法,它的复杂性是固定的(并且它可以证明是在具有负边权重的图中找到所有成对最短路径距离的一般问题的最有效解决方案。)

您只能通过使问题更具体或更小的数据集来改善运行时。对于一般解决方案,你会坚持使用你拥有的东西。

答案 2 :(得分:1)

通常我会建议使用Parallel Linq - 例如Ray Tracer示例,但是这假设您正在操作的项目是独立的。在您的示例中,您使用的是先前迭代的结果,在当前迭代中,无法进行并行化。

由于您的代码非常简单并且没有任何开销,因此您无法做任何事情来加快速度。如上所述,您可以将列表切换到数组。您可能还想在目标计算机上比较双算术和整数算术。

答案 3 :(得分:1)

在简单查看代码之后,似乎您可能正在寻找溢出,因为条件检查无法阻止它。

在你的代码中,下面的条件不会增加任何值,因为我们可以有距离[v] [i]&lt; Int.MaxValue&amp;距离[i] [w]&lt; Int.MaxValue但距离[v] [i] +距离[i] [w]&gt; Int.Maxvalue。

if (distance[v][i] != int.MaxValue && distance[i][w] != int.MaxValue)

答案 4 :(得分:0)

正如其他人所提到的那样,复杂性是固定的,因此你并没有很多选择。但是,您可以使用

  • 如果可能,请使用数组而不是列表。
  • 使用带有指针语义的“不安全”块,这会减少访问阵列数据所需的时间。
  • 检查您是否可以并行化算法。在你的情况下,你可以使用你的数据的多个副本(多个副本,以摆脱同步的需要),并有几个线程工作(例如通过将外环的范围分成一些子范围(1-1000,1001-2000)例如)。