以下循环的时间复杂度是多少?

时间:2012-06-12 16:32:01

标签: c++ big-o time-complexity

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

上面是一个嵌套的for循环。第一个for循环从0变为N,第二个for循环从i变为N.上述代码的时间复杂度是多少?

编辑:fun1是o(1)

5 个答案:

答案 0 :(得分:5)

O(N²* O(乐趣))。显然答案取决于乐趣的复杂性。

编辑:由于fun()= O(1),复杂性循环复杂度为O(n²)

答案 1 :(得分:2)

循环次数如下1 + 2 + 3 + ... + N,即N *(N + 1)/ 2 = N ^ 2/2 + N / 2。因此,时间复杂度为O(N ^ 2/2 + N / 2)= O(N ^ 2)

答案 2 :(得分:1)

由于fun1()是恒定时间,因此循环的复杂性是 O(N^2)

答案 3 :(得分:1)

外部for循环将运行内部for循环N次。

内部for循环将在外循环的第一个循环中调用fun1(i,j)N次。然后在外部for循环的第二个循环上(N-1)次。然后(N-2)次,然后(N-3)次,依此类推,当fun1(i,j)仅运行一次时,一直到外循环的第N个循环(i = N-1)。所以我们在内部循环的每次迭代中运行fun1(i,j)平均N / 2次。

因此假设fun1(i,j)具有O(fun1(i,j))的复杂度,我们得到的总复杂度为 O(n *(n / 2)* O(fun1(i,j)))= O(n ^ 2/2 * O(fun1(i,j))) 但是因为我们可以忽略N的大数值的数值常数来衡量复杂性,所以代码的复杂性顺序将是 O(n ^ 2 * O(fun1(i,j)))

因为fun1(i,j)是常数时间 O(fun1(i,j))= O(1),并且代码的复杂性将是 O(n ^ 2) )

他可以在Selection Sort Algo中看到类似的例子。请参阅选择排序算法。这里代替你的fun1(i,j)一个简单的赋值行'index_of_min = y;'使用,但这就像你的例子,可能会有所帮助。

答案 4 :(得分:0)

内循环的主体执行N + (N - 1) + (N - 2) + ... + 3 + 2 + 1

N + (N - 1) + (N - 2) + ... + 3 + 2 + 1 <= N * N因此循环体将运行次数增长O(n^2)

代码的总时间增长将取决于fun1 ()的复杂性。如果fun1 ()时间增长O(fun1),那么fun1 ()执行O(N^2)次答案将为:O(n^2 * O (fun1 ()))

修改

由于您已编辑fun1 ()O(1),因此总体复杂度为O(n^2 * O (fun1 ())) = O(n^2)