确定时间复杂度

时间:2016-09-12 16:49:21

标签: algorithm performance time-complexity complexity-theory

给出数组A的以下伪代码

x = 0
  for i = 0 to n - 1
    for j = i to n - 1
       if A[i] > A[j]:
          x = x + 1
  return x

如何确定运行时间? 我会说它(n - 1)*(n - 1)= n ^ 2 - 2n - 1 = O(n ^ 2)。

我不太确定如何使用if循环。

3 个答案:

答案 0 :(得分:4)

是O(n ^ 2),只是对内循环中的迭代次数求和:

n + (n - 1) + (n - 2) + ... 1 = [ n x (n + 1) ] / 2

如果不是循环,则它是一个控制结构。通常,您只需计算检查条件的次数而不考虑条件。如果if体中有另一个循环,则条件可能很重要。

如何计算内循环的迭代次数:

  • i = 0内循环运行n次,然后结束
  • 然后i = 1内循环运行n - 1次,然后结束
  • 然后i = 2内循环运行n - 2次,然后结束
  • ....
  • i = n - 2内循环运行1
  • i = n - 1内循环运行0

所以我们需要做的就是添加内循环的迭代次数:

n + (n - 1) + (n - 2) + ... 1 = [ n x (n + 1) ] / 2

答案 1 :(得分:1)

@perreal对订单完全正确:

n*(n+1)/2 => O(n^2)

关于" if"部分,它并不重要。 (我写这篇文章来回答这一部分)

让我们说检查是否需要c1时间,而x = x + 1则需要c2时间。你会有

(c1 | c1+c2)* n*(n+1)/2 

由于您可以忽略订单中的常量,因此它来自

  

为O(n ^ 2)

答案 2 :(得分:-1)

实际上,说"此算法的时间复杂度为O(n^2)"隐含地暗示它是最坏情况的复杂性。

以一种天真的方式,您可以计算在最坏情况下每条指令的执行次数。 if A[i] > A[j]:也可能被视为一种指示,所以首先你不必在条件成立时问自己。

2*(n-1)*(n-1)是在最内层循环中执行的指令数量的主要内容,更准确地说是:

2(n + (n-1) + ... + 1) = n(n+1) = O(n^2)

即使它对O - 符号不重要,也有几个数组的条件始终为真(因此这些算法是最坏的情况)。例如:

n n-1 n-2 ... 2 1