Big o 解释这个大O复杂度代码的答案 for(int-bound=1;boundn+2+logn,算法是O(n2)。(这一步我真的很困惑)
我想你应该将每个循环相乘,那么它不应该是logn(外循环)*n(第二个外循环)*n(第三个)*logn(第四个)。我如何知道我需要添加或相乘哪个循环,以及我应该取哪个循环的值(前两个循环我应该取n而不是logn,因为n处理起来更小?复杂度应该是Big o 解释这个大O复杂度代码的答案 for(int-bound=1;boundn+2+logn,算法是O(n2)。(这一步我真的很困惑),big-o,Big O,我想你应该将每个循环相乘,那么它不应该是logn(外循环)*n(第二个外循环)*n(第三个)*logn(第四个)。我如何知道我需要添加或相乘哪个循环,以及我应该取哪个循环的值(前两个循环我应该取n而不是logn,因为n处理起来更小?复杂度应该是O(n3) 首先考虑最内< /强>循环: for( int bound = 1; bound <= n; bound *= 2 ) { for( int i = 0; i < bound; i++ ) { for(
O(n3)
首先考虑<强>最内< /强>循环:
for( int bound = 1; bound <= n; bound *= 2 ) {
for( int i = 0; i < bound; i++ ) {
for( int j = 0; j < n; j += 2 ) {
... // constant number of operations
}
for( int j = 1; j < n; j *= 2 ) {
... // constant number of operations
}
}
}
索引j
取值1,2,4,8,16,
到n
,因此j
最多只能取log(n)+1
可能的值,因此此循环的复杂性是O(log(n))
因此,对于任何固定的bound
和i
,两个最内部循环完成的总功是O(n)+O(log(n))=O(n)
现在考虑两个“强>外最外< /强>循环。注意,如果最外循环的变量<代码>绑定< /代码>是代码> k< /代码>,那么由<代码> i < /代码>索引的循环将完全循环<代码> k< /代码>倍。
for( int j = 1; j < n; j *= 2 ) {
... // constant number of operations
}
请注意,这只是一个普通比率4
,因此求和得出:
1^2 + 2^2 + 4^2 + 8^2 + ... + (2^⌊log(n)⌋)^2
由于最里面的循环所做的功独立于这两个循环,所以前两个循环的总复杂度由
O(n2)*O(n)=O(n3)
给出,为什么是O(n)+O(log(n))
而不是O(n)*O(log(n))
?它们不是嵌套的,所以它们的总复杂度只是它们各自复杂度的总和哦,对不起,我在看外部的。没问题。有时读一个相当长的答案会让人困惑,要求澄清总是好的。:)顺便说一句,答案很好,我肯定会投赞成票,但我现在太累了,无法核实
for( int bound = 1; bound <= n; bound *= 2 ) {
for( int i = 0; i < bound; i++ ) {
// work done by the inner-most loops
}
}
1^2 + 2^2 + 4^2 + 8^2 + ... + (2^⌊log(n)⌋)^2
( 4(^(⌊log(n)⌋+1) - 1 ) / 3
= O(2^(2log(n))
= O(2^log(n^2))
= O(n^2)