嵌套循环的大 O 符号计算
Big O notation calculation for nested loop
for ( int i = 1; i < n*n*n; i *= n ) {
for ( int j = 0; j < n; j += 2 ) {
for ( int k = 1; k < n; k *= 3 ) {
cout<<k*n;
}
}
}
我在这个练习中遇到了一个问题,我需要找到以下代码的大 O 符号,但我得到了 O(n^5),其中第一个循环是 n^3,第二个循环 n,第三个循环是 n,我不确定我是否正确。有人可以帮我吗?
你错了。在第一个循环 for ( int i = 1; i < n*n*n; i *= n )
中注意“语句 3”(i *= n
),在第三个循环 for ( int k = 1; k < n; k *= 3 )
中也注意“语句 3”(k *= 3
)。你对第二个循环的计算很棒。
第一个循环是 i=1 每次乘以 n 直到它的 n^3 所以它的 3 次,这是 O(1)。
第二个循环是 j=1 并且每次添加 2 直到它的 n 所以它的 n/2 次,这是 O(n).
第三个循环是 k=1 并乘以 3 直到它的 n,即 O(log(n))
总体:O(n*log(n))
你的分析不正确。
外层循环每次迭代将i乘以n,从1开始直到n^3。
因此会有 3 次迭代,即 O(1).
中间循环每次迭代将 j 递增 2,从 0 开始直到 n。
因此会有 n/2 次迭代,即 O(n).
内部循环将k乘以3,从1到n。
因此会有log3(n)次迭代,也就是O(log(n)).
如果这一步不清楚,请看这里:Big O confusion: log2(N) vs log3(N).
代码的总时间复杂度是上面所有 3 个表达式的乘积(因为它们是嵌套循环)。
因此是:O(1) * O(n) * O(log(n)),即:O(n*log(n)).
for ( int i = 1; i < n*n*n; i *= n ) {
for ( int j = 0; j < n; j += 2 ) {
for ( int k = 1; k < n; k *= 3 ) {
cout<<k*n;
}
}
}
我在这个练习中遇到了一个问题,我需要找到以下代码的大 O 符号,但我得到了 O(n^5),其中第一个循环是 n^3,第二个循环 n,第三个循环是 n,我不确定我是否正确。有人可以帮我吗?
你错了。在第一个循环 for ( int i = 1; i < n*n*n; i *= n )
中注意“语句 3”(i *= n
),在第三个循环 for ( int k = 1; k < n; k *= 3 )
中也注意“语句 3”(k *= 3
)。你对第二个循环的计算很棒。
第一个循环是 i=1 每次乘以 n 直到它的 n^3 所以它的 3 次,这是 O(1)。
第二个循环是 j=1 并且每次添加 2 直到它的 n 所以它的 n/2 次,这是 O(n).
第三个循环是 k=1 并乘以 3 直到它的 n,即 O(log(n))
总体:O(n*log(n))
你的分析不正确。
外层循环每次迭代将i乘以n,从1开始直到n^3。
因此会有 3 次迭代,即 O(1).
中间循环每次迭代将 j 递增 2,从 0 开始直到 n。
因此会有 n/2 次迭代,即 O(n).
内部循环将k乘以3,从1到n。
因此会有log3(n)次迭代,也就是O(log(n)).
如果这一步不清楚,请看这里:Big O confusion: log2(N) vs log3(N).
代码的总时间复杂度是上面所有 3 个表达式的乘积(因为它们是嵌套循环)。
因此是:O(1) * O(n) * O(log(n)),即:O(n*log(n)).