我正在练习算法的时间复杂度,我遇到了下面的代码让我很困惑。一般来说,我能够通过查看循环的数量来判断算法的复杂性,但是下面的代码会假设这个假设,因为有两个循环,我通常认为复杂度是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++)
答案 0 :(得分:4)
时间复杂度 O(n sqrt(n)) = O(n ^(3/2))。
例如,考虑N = 100; i ^ 2采用值1,4,9,16,...,100,这是sqrt(N)个不同的值。所以这是 O(sqrt(n))。
j
和N
的平方根应该清楚这是一个线性循环。例如,考虑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)。