我已经看到了很多时间复杂性问题,但似乎没有一个能帮助我理解它 - 就像真的得到它一样。
我从阅读材料和实践尝试中得到的所有内容似乎都归结为编码器给出的Determining complexity for recursive functions (Big O notation)中所提到的内容 - 这实际上帮助我更多地了解了正在发生的事情时间复杂性。
如此功能如何:
def f(n):
if n < 3:
return n
if n >= 3:
return f(n-1) + 2*f(n-2) + 3*f(n-3)
由于函数调用函数3次,这是否意味着时间复杂度为O(3 ^ n)?
至于空间复杂性,它似乎是线性的,因此我提出复杂度为O(n)。
我错了吗?
答案 0 :(得分:3)
由于函数调用函数3次
这不是非常正确,而是让我们使用比您的特定示例更精确的示例。
customerCase
这将始终在相同的时间内运行,因此是O(1)
null
这有O(N)时间
def constant(n):
return n*12301230
这是以二次时间O(N ^ 2)运行,因为内循环运行n次,外循环运行n次。
还有更具体的log(N),N * log(N),(2 ^ N)等示例,但是,回到你的问题:
由于函数调用函数3次,这是否意味着时间复杂度为O(3 ^ n)?
如果函数被调用3次,它仍然是def linear(n):
total = 0
for x in xrange(n):
total+=1
return total
的恒定时间,def quadratic(n):
total = 0
for x in xrange(n):
for y in xrange(n):
total+=1
return total
是线性的,constant(x)
是二次的。重要的是,O(3 ^ n)是指数时间并且与n ^ 3不同。然后,我们不会使用3作为基础,而是使用2 ^ n作为标准。
因此,您的函数将具有x <3的恒定时间。最接近你的函数给出的,我通过计时器运行它,但它的递归和难以计算。如果你提供另一个非递归的例子,我很乐意告诉你它的复杂性。
希望这有点帮助,图表并不能确定与n ^ 2相比增长2 ^ n的速度,但这是一个良好的开端。