【发布时间】: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)。
-
如果
<do something>是.. 因素ackermann(n, n) -
这个问题似乎是cs.stackexchange.com的话题
-
卡兹,感谢您的链接。我不知道那件事。顺便说一句,这正是我对
的想法 :)
标签: python for-loop time-complexity