我对以下程序的时间复杂性有疑问。我知道为什么第一个for循环是n + 2但是第二个for循环为什么它是(n + 1)/ 2?
//示例for循环 //这不是一个完全编码的程序,仅用于循环时间复杂度分析
for (int i=n; i>=0; i--) //n + 2
for (int j=i; j<n; j++) // (n+2)(n+1)/2
cout << i << “,” << j <<endl; //(n+1)(n)/2
答案 0 :(得分:2)
内循环运行n-i
次;即,i==n
时运行0次,i == n-1
时运行1次,n
时运行i == 0
次;共计n*(n+1)/2
次。 (不是(n+1)*(n+2)/2
,如您的评论中所述)。
由于内循环已启动n+1
次(而不是n+2
,正如您所述),可以公平地说平均值次数运行是n/2
。
答案 1 :(得分:2)
首先,你的第一个循环的时间复杂度为O(n),嵌套循环法线的时间复杂度为O(n ^ 2),但对于i的每个值,内循环执行i次。外循环执行n次,因此您会看到如下执行模式:1 + 2 + 3 + 4 + ... + n次
具体信息:
O(1):函数(或一组语句)的时间复杂度 如果它不包含循环,递归和调用,则认为是O(1) 任何其他非恒定时间函数。
O(n):a的时间复杂度 如果循环变量递增/则循环被视为O(n) 减少一定量。例如以下功能 具有O(n)时间复杂度。
O(n ^ c):嵌套循环的时间复杂度等于执行最内层语句的次数。
来源 - &gt; Link
答案 2 :(得分:2)
将i
从1迁移到N
,将j
从1迁移到i
的当前值,就像探索维度{{ 1}} N
,对角分割。要理解这一点,请在纸上为自己绘制表格:行上的N+1
,列上的i
,以及嵌套循环访问的每个单元格中的刻度。
答案 3 :(得分:0)
for
循环的时间复杂度为O(N ^ 2)。
我刚刚在codereview.stackexchange.com上回答了类似的问题。
这是一个简单的程序,用于说明循环的时间复杂度。
#include <iostream>
using namespace std;
int main()
{
const int N = 10;
int numTotalOps = 0;
for (int i = 0; i < N; ++i)
{
size_t numOps = 0;
for (int j=i; j < N; j++)
{
cout << i << "," << j << endl;
++numTotalOps;
++numOps;
}
cout << "\nNumber of operations for i = " << i << ": " << numOps << endl;
}
cout << "\nNumber of total operations: " << numTotalOps << endl;
return 0;
}
输出:
0,0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0,9
Number of operations for i = 0: 10
1,1
1,2
1,3
1,4
1,5
1,6
1,7
1,8
1,9
Number of operations for i = 1: 9
2,2
2,3
2,4
2,5
2,6
2,7
2,8
2,9
Number of operations for i = 2: 8
3,3
3,4
3,5
3,6
3,7
3,8
3,9
Number of operations for i = 3: 7
4,4
4,5
4,6
4,7
4,8
4,9
Number of operations for i = 4: 6
5,5
5,6
5,7
5,8
5,9
Number of operations for i = 5: 5
6,6
6,7
6,8
6,9
Number of operations for i = 6: 4
7,7
7,8
7,9
Number of operations for i = 7: 3
8,8
8,9
Number of operations for i = 8: 2
9,9
Number of operations for i = 9: 1
Number of total operations: 55