【问题标题】:Big-o analysis of performing an O(n) within a loop executing n! times在执行 n! 的循环中执行 O(n) 的 Big-o 分析!次
【发布时间】:2013-12-05 03:35:40
【问题描述】:

我正在尝试确定以下的时间复杂度:

while loop that executes n! times {

     perform an operation that is O(n)

  }

big-o 分析还会是O(n!) 吗?我不知道它会如何O(n^n)。任何见解将不胜感激。

编辑:是的,我知道这非常低效

【问题讨论】:

  • 为什么你认为O(n^n) 是可能的?
  • O(n^n)更糟
  • 效率就是n*n!,你在做n工作n!次
  • 我不是真的,但我觉得这不可能是 O(n!),因为我相信,最坏的情况实际上可能需要更长时间。据我所知,O(n^n) 是下一次设置的时间复杂度,所以我认为它可能会落入该阈值。
  • @megawac : 你怎么知道的?

标签: algorithm loops big-o time-complexity


【解决方案1】:

如果你真的想要一个等价物,那么你的解决方案是:

O(n^(n+3/2) / e^n)

这来自Stirling's approximation 声明n! = O(n^(n+1/2)/e^n)

【讨论】:

    【解决方案2】:

    只要用代数的方式想一想,n*n 的乘积如何!永远给你n^n,它不会..n!做 n 个工作的迭代只是 n*n!

    【讨论】:

    • 好的,这是有道理的,但据我所知,没有 O(n*n!) 集。它实际上仍然是 O(n!) 吗?
    • 让我问你这个问题......如果你循环 n 次并且每次都做 log(n) 工作,复杂度会是 O(n)...不......它的 nlog(n )....就像这里一样 O(n*n!)
    • 对,应该是 O(n log n),这是我之前在时间复杂度图上看到的一个指定集合。我只是很困惑,因为 nn!将比 n 增长得更快!所以我不明白为什么会是O(n!)。如果它实际上是 O(nn!),我明白了,我只是没有意识到你可以指定其他这样的集合。
    • 我知道您来自哪里,但是,对于大型数据集而言,n 是需要忽略的大量额外工作
    • 所以要清楚,我可以指定上面的算法将在 O(n*n!) 时间内运行?我还没有上过算法课,所以我的困惑来自于只看到标准:O(1), O(log n), O(n), O(n log n), O(n^2), O(2^n)、O(n!) 和 O(n^n)。
    【解决方案3】:

    你正在为 n 做 n 个工作!次。这只是 O(n*n!)。

    【讨论】:

      【解决方案4】:

      不是O(n^n)。它的复杂度是O(n*n!)

      您可以通过计算n 的不同值来轻松追踪这一点:

      当n = 1时,内部操作执行1次
      当 n = 2 时,内部操作执行 2 次
      当 n = 3 时,内部运算执行 6 次
      n = 4时,内部运算执行24次

      【讨论】:

        【解决方案5】:

        我认为您必须了解大O表示法的含义:

        f(x) = O(g(x))如果存在整数Nc,那么对于n >= Nf(x) <= c g(x)

        您不能说您的代码是O(n!),因为对于足够大的nn*n! 对于任何c 总是大于c n!

        证明:假设存在整数c, N,这样对于n >= N, d*n*n! < c*n! => d*n < c for n >= N,这是一个矛盾。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多