【问题标题】:Calculating Big O notation: O(n^4) for 2 nested loops and O(log n) with no recursion计算大 O 表示法:2 个嵌套循环的 O(n^4) 和没有递归的 O(log n)
【发布时间】:2019-02-23 22:53:02
【问题描述】:

我已经有一段时间没有做一些运行时复杂度近似练习了,我一直在尝试围绕网上找到的以下示例(cmets 是我自己的):: p>

示例 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),但我看不到。我确定我错过了一些东西,因为在我的 cmets 中,我计算出在最坏的情况下它是 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

我基本上想知道我错过了什么,以及我应该经历哪些步骤/指南才能为这两种情况(尤其是第一个示例)找到正确的大 O 复杂度。 对于任何不清楚的细节,我深表歉意,我很高兴添加更多说明。 提前致谢,感谢任何见解!

【问题讨论】:

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


    【解决方案1】:

    示例 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)。在jth 迭代中,i2^j2^j &gt; n 的阈值为j &gt; lg n

    【讨论】:

    • 感谢您的回答,虽然看起来很简单,但您能否详细说明您的工作,尤其是示例 1?我不太明白:Theta(n sum_{i=1}^n (ii * 1/i * ii))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2011-12-12
    • 2022-07-18
    相关资源
    最近更新 更多