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)
答案 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)