计算大O表示法:2个嵌套循环的O(n ^ 4)和无递归的O(log n)

时间:2019-02-23 22:53:02

标签: algorithm time-complexity big-o complexity-theory

自从我做了一些运行时复杂度近似练习以来,已经有一段时间了,我一直在努力将下面的例子包裹在网上找到的以下示例中(这些注释是我自己的):

示例1:

for ( int i = 1 ; i <= n ; i++) { //n
  for ( int j = 1; j <= i*i ; j++) { // 1+2^2+3^2+...+n^2
    if ( j % i == 0) {
      for ( int k = 0 ; k < j ; k++ ){ // 1+2^2+3^2+...+n^2
        sum++;
       }
      }
     }
    }

解决方案表说它是O(n ^ 4),但我看不到它。我敢肯定我错过了一些东西,因为在我的评论中,我算出最坏的情况是O(n ^ 5)。

示例2:

i = 1 ;
L2 = -1;
while ( i <= n ) {
  i = i*2 ; // 2 + 2^2 + 2^3+ ...+ 2^n
  L2++;
}

提到的解决方案是O(log n)。我认为在最坏的情况下,我会得到2 ^ n <= n的东西,因此n <= log n。在这里,应用上界函数的典型定义(即f(n)<= O(g(x)))更为直观

我基本上想知道我错过了什么,以及应该为哪种情况找到正确的大O复杂度(特别是第一个示例)应该遵循哪些步骤/准则。 对于任何不清楚的细节,我深表歉意,并很高兴补充说明。 预先感谢,感谢您的见解!

1 个答案:

答案 0 :(得分:0)

示例1是O(n^5),因为big-O是一个上限。它也是Theta(n^4),因为if语句使最内层的循环仅每i个迭代运行,因此运行时间为Theta(n sum_{i=1}^n (i*i * 1/i * i*i)) = Theta(n^4)

示例2为O(log n)。在第j次迭代中,i2^j,而2^j > n的阈值为j > lg n

相关问题