这种算法的大O是什么?

时间:2016-01-19 01:26:56

标签: algorithm big-o

如果您的代码看起来像这样,那么大O会是什么?我不确定if语句如何影响大O.

n = some arbitrary number
for(i = 0; i < n; i++)
  for(j = 0; j < n; j++)
    if(i <= j)
      for(k = i; k <= j; k++)
        //do some simple operation
        y = x+1
    else
        //do some simple operation
        y = y+1

我不考虑编译器优化。我知道这介于O(n ^ 2)和O(n ^ 3)之间但不确定,因为if语句并不总是执行最内层的循环。

4 个答案:

答案 0 :(得分:2)

O(N * N * N)我们可以说是O(N ^ 3)

First Loop发生了N次。 第二个循环发生N次。 那些相乘以得到O(N ^ 2)

在所有可能的N ^ 2循环中,第三个循环将运行大约一半的时间,即O(N / 2),相当于O(N)。

这就是你得到O(N * N * N)或O(N ^ 3)

的方法

答案 1 :(得分:0)

事实上,您可以(几乎确切地)计算您执行的操作次数:

i:0到n-1 = N次操作

X

j:0到n-1 = N次操作

X

仅当i <= j,从i到j或其他任务O(1)

其他任务为您提供NxN操作,然后是O(NxN)

即,如果你反转

对于每个j(0到n-1):N次操作

然后对于从0到j的每个i,你从i到j进行操作,即j-i + 1

与每个0到j操作完全相同。然后你有(j + 1)x(j + 2)/ 2次操作。

然后最后,从0到N得到Sum(j + 1)x(j + 2)/ 2,这是

1/2((N + 1)x(N + 2)/ 2 +(N + 1)^ 3/3 +(N + 1)^ 2/2 +(N + 1)/ 6)操作,所以O(N ^ 3)

也许,我忘了一些+/- 1

答案 2 :(得分:0)

您可以使用Sigma表示法分析算法:

enter image description here

由此可见,时间复杂度将取决于立方n项,因此您的算法位于O(n^3)

答案 3 :(得分:-1)

这是O(N ^ 3)。

证明:http://www.wolframalpha.com/input/?i=sum+sum+%28j+-+i+%2B+1%29%2C+j+%3D+i+to+n+-+1%2C+i+%3D+0+to+n+-+1

上一个周期运行(j - i + 1)次。

如何手动查找此金额? 这不是火箭数学。

尝试阅读https://en.wikipedia.org/wiki/Telescoping_series

为了节省时间,为此目的使用wolframalpha更容易。