【问题标题】:What time complexity is this nested loop with multiplication?这个带有乘法的嵌套循环的时间复杂度是多少?
【发布时间】:2021-03-04 10:49:41
【问题描述】:

education.io 认为下面的代码具有复杂度 log2(n!) 因为var 每增加一个 n 值。

但是,我和我的同事认为,因为 var 始终是 < n,所以它不可能是 log2(n!),因为它永远不会比 while 循环刚刚跑掉 @987654324 花费更多的时间@。如果在 while 谓词中使用 n,则时间复杂度为 n*log2(n)。

public static void main(String[] args) {
    int n = 10;   

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

【问题讨论】:

  • 它是 log2(n!)。您是否忘记了日志部分,并且可能认为它被报告为 n!?

标签: algorithm big-o


【解决方案1】:

你们都说得对。首先,为什么它是 O(log n!):

  • 如果将每个单独迭代的成本加起来,总运行时间为 O(log 1 + log 2 + ... + log n)。

  • 根据对数的乘积法则,log a + log b = log a×b。

  • 因此,O(log 1 + log 2 + ... + log n) = O(log 1×2×...×n) = O(log n!)。

一旦确定,就可以显示O(log n!) = O(n log n)。它们实际上是同一个复杂度类。

【讨论】:

    【解决方案2】:

    你应该考虑这个说法,你们俩都是对的:

    O(n*lg(n))=O(lg(n!))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2015-06-17
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多