【问题标题】:Time complexity of a simple java piece of code一段简单java代码的时间复杂度
【发布时间】:2020-05-12 14:17:22
【问题描述】:

我有以下代码,我知道它的大 O 复杂度为 n*(log2(n))^2,但我不明白为什么前两个循环的复杂度均为 log2(n)。有人可以解释一下为什么会这样吗?谢谢。

for (int i = n; i>0; i/=2) {
   for (int j = 1; j < n; j*=2) {
       for (int k = 0; k < n; k+=2) { 
              ... // constant time number of operation
        }
    }
}

【问题讨论】:

  • 您似乎在这里遗漏了一个循环 - i 上是否有您打算在此处包含的外部循环?
  • 是的,我对此很陌生,我可能在不知情的情况下删除了一行代码。我想现在已经修好了。谢谢!

标签: performance loops big-o complexity-theory


【解决方案1】:

第一个循环执行O(log(n)) 迭代,因为i 的值等于n 除以两个数字的幂,例如n, n/2, n/4, n/8, .., 1。事实上,要达到0,我必须至少除以2,因为n &lt; 2^iCount,因此n / (2^iCount) &lt; 1

第二个循环执行O(log(n)) 迭代,因为j 的值是2 的幂,例如1, 2, 4, 8, 16, ...j 的最后一个可能值是2^(floor(log(n)))。

第三个循环执行O(n/2) 迭代,因为k 的值是0, 2, 4, 6, 8, ...

【讨论】:

  • 惊人的解释。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 2013-10-05
  • 2020-07-24
  • 1970-01-01
相关资源
最近更新 更多