两个非嵌套循环的大 O 表示法
Big O Notation for two non-nested loops
对于两个未嵌套的 for 循环,Big O 表示法是什么?
示例:
for(int i=0; i<n; i++){
System.out.println(i);
}
for(int j=0; j<n; j++){
System.out.println(j);
}
这将是 O(2n) 因为你 运行 n+n = 2n 次迭代。
O(2n) 本质上等同于 O(n),因为 2 是常数。
线性
O(n) + O(n) = 2*O(n) = O(n)
你有多少个非嵌套循环并不重要(如果这个数字是一个常数并且不依赖于n
)复杂度将是线性的并且等于循环。
从技术上讲,这个算法仍然在 O(n) 时间内运行。
虽然n
每次增加迭代次数增加2次,但所花费的时间仍然以线性的速度增加,因此,O(n)时间.
它将是 O(n)
+ O(n)
==> 实际上 O(n)
因为我们不保持常量值。
假设一个场景每个循环 运行s 最多 n
所以我们可以说每个 for 循环的复杂度是 O(n)
因为每个循环将 运行 n 次。
所以你指定这些循环不嵌套在线性场景中 第一个循环 O(n)+ 第二个循环 O(n)+ 第三个循环 O(n) 这将给你3O(n)
.
现在,由于我们主要关注复杂性的可变部分,因此我们将排除常量部分,并称在这种情况下它是 O(n)
。
但在实际场景中,我建议您记住,常数因子也将起着至关重要的作用,因此永远不要排除它们。
例如,考虑从整数数组中找到最小整数的时间复杂度,任何人都会说它是 O(n)
,但要找到同一数组的第二大或最小整数将是 O(2n)。
但大多数答案会说 O(n)
实际上忽略了常量。
考虑如果数组的大小为 1000 万,那么该常数不能被忽略。
对于两个未嵌套的 for 循环,Big O 表示法是什么?
示例:
for(int i=0; i<n; i++){
System.out.println(i);
}
for(int j=0; j<n; j++){
System.out.println(j);
}
这将是 O(2n) 因为你 运行 n+n = 2n 次迭代。
O(2n) 本质上等同于 O(n),因为 2 是常数。
线性
O(n) + O(n) = 2*O(n) = O(n)
你有多少个非嵌套循环并不重要(如果这个数字是一个常数并且不依赖于n
)复杂度将是线性的并且等于循环。
从技术上讲,这个算法仍然在 O(n) 时间内运行。
虽然n
每次增加迭代次数增加2次,但所花费的时间仍然以线性的速度增加,因此,O(n)时间.
它将是 O(n)
+ O(n)
==> 实际上 O(n)
因为我们不保持常量值。
假设一个场景每个循环 运行s 最多 n
所以我们可以说每个 for 循环的复杂度是 O(n)
因为每个循环将 运行 n 次。
所以你指定这些循环不嵌套在线性场景中 第一个循环 O(n)+ 第二个循环 O(n)+ 第三个循环 O(n) 这将给你3O(n)
.
现在,由于我们主要关注复杂性的可变部分,因此我们将排除常量部分,并称在这种情况下它是 O(n)
。
但在实际场景中,我建议您记住,常数因子也将起着至关重要的作用,因此永远不要排除它们。
例如,考虑从整数数组中找到最小整数的时间复杂度,任何人都会说它是 O(n)
,但要找到同一数组的第二大或最小整数将是 O(2n)。
但大多数答案会说 O(n)
实际上忽略了常量。
考虑如果数组的大小为 1000 万,那么该常数不能被忽略。