相关嵌套循环的O复杂度很高

时间:2019-02-01 05:30:06

标签: algorithm big-o

我可以在理解如何解决本教程问题方面获得帮助吗?我仍然不明白我的教授的解释。我不确定如何计算第三个/最内层循环的大0。她解释说,该算法的答案是O(n ^ 2),第二个和第三个循环必须被视为O(n)的大0的一个循环。有人可以用基本的外行术语向我解释第二/第三循环的大O表示法吗 假设n = 2 ^ m

for ( int i = n; i > 0; i --) {     
  for (int j =1; j < n; j *= 2){
        for (int k =0; k < j; k++){
        }
  }
 }

据我了解,第一个循环的O符号表示为O(n) 第二个循环= log(n) 第三个循环= log(n)(因为它将循环的次数减少了logn)* 2 ^(2 ^ m-1)(表示j的增加)

4 个答案:

答案 0 :(得分:1)

let将print语句添加到最内部的循环中。

for (int j =1; j < n; j *= 2){
        for (int k =0; k < j; k++){
            print(1)
        }
}

的输出

j = 11 1

j = 21 1 1

j = 41 1 1 1 1

...

j = n1 1 1 1 1 ... n+1次。

问题归结为将打印多少1个。

那个数字是

(2^0 + 1) + (2^1 + 1) + (2^2 + 1) + ... + (n + 1)

= (2^0 + 1) + (2^1 + 1) + (2^2 + 1) + ... + (n + 1)

= log n + (1 + 2 + 4 + ... + n)

= O(log n + n)

= O(n)


假设您知道为什么(1 + 2 + 4 + ... + n) = O(n)

答案 1 :(得分:0)

var fs = require("fs");

fs.rename("newFile.txt", "sample.txt", (error) => {
    console.log("error")
})

console.log("success")

因此,总的复杂性将是这三个问题的总和,如问题下的评论中所述。
上限可以是松散的或紧的。
您可以说它是for ( int i = n; i > 0; i --) { // This runs n times for (int j =1; j < n; j *= 2){ // This runs atmost log(n) times, i.e m times. for (int k =0; k < j; k++){ // This will run atmost m times, when the value of j is m. } } } loosely bound under O(n^2)

答案 2 :(得分:0)

O表示法是一个上限。您可以说它具有O(n ^ 2)。对于上限值,我认为应该是属于O(n*log(n)*log(n))的{​​{1}}。

答案 3 :(得分:0)

是因为对数。如果您将log(16)提高到2的幂,则将log(n)提高到2的幂。这就是为什么您的老师说要把第二个和第三个循环一起看成O(n)。

如果第二个循环的最大迭代次数为O(log(n)),则第二个和第三个循环将为:O(1 + 2 + 3 + ... + log(n))= O(log( n)(log(n)+1)/ 2)= O((log(n)^ 2 + log(n))/ 2)= O(n)