【问题标题】:Time Complexity of complex nested for loops复杂嵌套 for 循环的时间复杂度
【发布时间】:2014-04-01 04:17:44
【问题描述】:

以下代码的时间复杂度是多少?

def func(n):
    for _ in range(n):
        if n == 4:
            for _ in range(n):
                <do something>

对于一个特定的输入 (n = 4),它只会是 O(n^2),但对于所有其他输入,它是 O(n)。在这种情况下,最坏的情况显然是 O(n^2),但我的导师说 O(n) 是正确答案。如果“big-Oh”表示法是表示最坏的情况,为什么不是 O(n^2)?

另一个是:

def func2(n):
    for _ in range(n):
        if n%2 == 0:
            for _ in range(n):
                <do something>

我不太确定这段代码的运行时间。同样,最坏的情况是 O(n^2)。这一次,所有可能输入的一半导致最坏的情况。这足以说明代码在 O(n^2) 时间内运行吗?

如果第一部分是 O(n),第二部分是 O(n^2),那么当您为“big-Oh”表示选择真正最坏的情况时,是否有一般的经验法则?

【问题讨论】:

  • O 表示法忽略有限数量的“小”n 值。对于 n > 4,第一个函数每次调用只进行 n 次迭代,因此渐近复杂度为 O(n)。第二个函数确实是 O(n^2)。一般的方法是根据n找到指令数的封闭形式,然后从那里算出big-Oh
  • 根据Wikipedia:在数学中,大 O 表示法描述了当参数趋于特定值或无穷大时函数的限制行为,通常是在更简单的函数方面。因此,随着 n 向无穷大增长,复杂度为 O(n)。
  • 如果&lt;do something&gt; 是.. 因素ackermann(n, n)
  • 这个问题似乎是cs.stackexchange.com的话题
  • 卡兹,感谢您的链接。我不知道那件事。顺便说一句,这正是我对 的想法 :)

标签: python for-loop time-complexity


【解决方案1】:

更新

第一种情况是 O(n),因为即使 n=4,复杂度也是一个范围为 4 的嵌套循环,它具有 16 次迭代的恒定开销。对于 n 的所有其他值,它是 O(n)。随着 n 的增长,永远不会达到 n==4 的条件,因此复杂度不会随 n 增长。

在情况 2 中,对 func2 的一半调用涉及复杂度为 O(n^2) 的内部循环,这就是整体复杂度为 O(n^2) 的原因。随着n的增长,时间需求增长O(n^2)

【讨论】:

  • 您好,我可能是错的,但我认为您的答案不正确。 if 情况说 if n == 4 或 if n%2 == 0。对我来说,这意味着 if 输入值 (n) 为 4 甚至第二个 for 循环都会执行。
猜你喜欢
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多