Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Big o 解释这个大O复杂度代码的答案 for(int-bound=1;boundn+2+logn,算法是O(n2)。(这一步我真的很困惑)_Big O - Fatal编程技术网

Big o 解释这个大O复杂度代码的答案 for(int-bound=1;boundn+2+logn,算法是O(n2)。(这一步我真的很困惑)

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(

我想你应该将每个循环相乘,那么它不应该是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( 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)