这两个伪算法有不同的执行时间吗?

时间:2017-01-27 11:46:17

标签: algorithm time-complexity

// -- Algorithm A
    int a = 1, b = 2;
    for (int n = 0; n < 100; n++)
    {
        int c = a + b + n;
        int d = a - b - n;
    }

// -- Algorithm B
    int a = 1, b = 2;
    for (int n = 0; n < 100; n++)
    {
        int c = a + b + n;
    }

    for (int n = 0; n < 100; n++)
    {
        int d = a - b - n;
    }

我应该尝试使用现有的循环来进行必要的操作吗?或者最终结果是一样的?

4 个答案:

答案 0 :(得分:1)

在O(n)表示法中,它们将是相同的。根据{{​​3}}:

你们将会有一个 Sum

O(n) + O(n) = O(2n)

然后乘以常数

O(2n) = O(n)

所以最后它将是O(n)

答案 1 :(得分:1)

复杂性,两种算法都是O(n)。即使考虑乘法常数,也可以说一个是n * 2而另一个是n + n,这是完全相同的。

但实际上,这取决于。有人可能会争辩说,由于第二个分支执行的分支数量是原来的两倍,性能可能会更差(see this famous question),但最终还是取决于编译器,特定输入,操作系统等。

答案 2 :(得分:1)

在您当前的实施中

  int a = 1, b = 2;

  for (int n = 0; n < 100; n++)
  {
      int c = a + b + n;
      int d = a - b - n;
  }

您无所事事:cd都是本地视觉效果,存在 仅在for循环范围内;如果优化器足够智能来找出它 整数溢出1 + 2 + 1001 - 2 - 100都不可能 [int.MinValue..int.MaxValue] for (int n = 0; n < N; n++) { f(n); g(n); } 可以在 for (int n = 0; n < N; n++) f(n); for (int n = 0; n < N; n++) g(n); 之内 通过警告消除整个循环给开发人员。

真实世界的例子是

f(n)

Versus

g(n)

N T = f(0) + g(0) + f(1) + g(1) + ... f(N - 2) + g(N - 2) + f(N - 1) + g(N - 1) 都没有副作用T = f(0) + f(1) + ... f(N - 2) + f(N - 1) + g(0) + g(1) + ... g(N - 2) + g(N - 1) 足够大。 到目前为止一切顺利,在第一种情况下,执行时间是

O(...)

在第二种情况下

{{1}}

如您所见,执行时间是相同(不仅仅是{{1}})。 在现实生活中,两个实现之间可能存在微小差异: 循环初始化和实现细节,CPU寄存器利用率等。

答案 3 :(得分:0)

绝对第一个算法会更快,但由于复杂性只是线性增加,第二个算法也不错。至于你不是二次方都是好的,

但是如果你最终编写了这样的循环,那么你就有n ^ 2的复杂性,这是不好的

相关问题