计算嵌套循环的时间复杂度

时间:2015-04-26 23:06:39

标签: algorithm time-complexity

我正在练习算法的时间复杂度,我遇到了下面的代码让我很困惑。一般来说,我能够通过查看循环的数量来判断算法的复杂性,但是下面的代码会假设这个假设,因为有两个循环,我通常认为复杂度是O(N ^ 2)但是在第二个循环N是平方的。这使我得出结论:复杂度为O(N)* O(N ^ 2)= O(N ^ 3)。我在这里做错了吗?

for (int i = 0; i*i < N; i++)
   for (int j = 0; j*j < N*N; j++)

2 个答案:

答案 0 :(得分:4)

时间复杂度 O(n sqrt(n)) = O(n ^(3/2))。

  • 外部循环需要 O(sqrt(n))时间。它在~sqrt(n)迭代之后完成,因为我增长为正方形,而N只是线性增长。

例如,考虑N = 100; i ^ 2采用值1,4,9,16,...,100,这是sqrt(N)个不同的值。所以这是 O(sqrt(n))

  • 内循环需要 O(n)时间 - 在每个步骤中取jN的平方根应该清楚这是一个线性循环。

例如,考虑N = 10; j ^ 2取值1,4,9,16,...,100,这是N个不同的值。所以这是 O(n)

答案 1 :(得分:3)

外部循环将在i ^ 2&lt; N,或等同于i&lt; SQRT(N)。这意味着外循环将运行sqrt(N)次。

内循环将在j ^ 2&lt; N ^ 2,或等效地当j <2时N.这意味着内循环将运行N次(对于外循环的每次迭代)。

因此,迭代总数为(N ^ 0.5)* N = N ^(3/2)。