c# - 有没有一种好的方法来优化迭代次数相乘的嵌套 for 循环?

标签 c# algorithm optimization nested

我有一个 for 循环,它通过将循环中的值相乘来创建和:

int i;
int j;

float total = 0;
int x = 1000;

for (i = 0; i < x; i++)
{
    for (j = 0; j < x; j++)
    {
        total += i * j;
    }
}

有没有更好的方式来写这个?当 x 变得较大时,处理所需的时间长得令人难以置信

我的研究表明嵌套 for 循环已经足够好了,但我想知道是否有办法简化它。

最佳答案

您根本不需要嵌套循环,给定 x闭合公式

total = x * x * (x - 1) * (x - 1) / 4;

请注意整数溢出(注意 long 结果和 x )

long x = 1000;
long total = x * x * (x - 1) * (x - 1) / 4;

编辑:让我们看一下一般情况,我们必须处理任意数字,比如数组 ab :

long total = 0;

for (int i = 0; i < a.Length; ++i)
  for (int j = 0; j < b.Length; ++j)
    total += a[i] * b[j];

在这种情况下,我们无法提出闭合公式,但我们可以优化 计算。我们正在寻找 total

  a[0] * b[0] + a[0] * b[1] + ... + a[0] * b[m] +
  a[1] * b[0] + a[1] * b[1] + ... + a[1] * b[m] +
  ...
  a[n] * b[0] + a[n] * b[1] + ... + a[n] * b[m] = 


= a[0] * (b[0] + b[1] + ... + b[m]) +
  a[1] * (b[0] + b[1] + ... + b[m]) +
  ...
  a[n] * (b[0] + b[1] + ... + b[m]) =


= (a[0] + a[1] + ... a[n]) * (b[0] + b[1] + ... + b[m])  

到目前为止一切顺利,而不是嵌套循环O(n * m)复杂性我们有两个分开的循环并且只有O(n + m)时间复杂度。

我们经常在 Linq 的帮助下完成此类任务:

using System.Linq;

...

long total = a.Sum(item => (long) item) * b.Sum(item => (long) item)

但是你可以很好地使用旧的循环:

long sumA = 0;

foreach (var item in a)
  sumA += item;

long sumB = 0;

foreach (var item in b)
  sumB += item;

long total = sumA * sumB;

关于c# - 有没有一种好的方法来优化迭代次数相乘的嵌套 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74244447/

相关文章:

c# - Windows 窗体 TabIndex 不遵循索引

c - 击键生成

c# - 要求用户键入两个二进制值并执行按位异或运算符

c# - 如何从不同的主机连接到我的 SignalR 集线器?

php - 查看我的数字是否在范围数组中的最佳算法是什么?

c - C 方言会影响 gcc 中的优化吗?

c - SSE 内部函数 : Fastest way to test for all 0s or 1s?

c++ - GCC C++ "Hello World"程序 -> .exe 在 Windows 上编译时为 500kb 大。我怎样才能减小它的大小?

c# - DataGridView 中的 ColumnCount 和 Columns.Count 有什么区别

algorithm - 维护一个大于内存的排序列表