【问题标题】:Time and Space Complexity Trouble时间和空间复杂性问题
【发布时间】:2016-09-05 11:56:28
【问题描述】:

我见过很多时间复杂度问题,但似乎没有一个能帮助我理解它——就像真的明白了一样。

我从阅读和实践尝试中得到的一切似乎都归结为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)。

我错了吗?

【问题讨论】:

  • 你必须写下递归关系,然后解决它们。在简单的情况下有一些简单的技巧(例如:嵌套的独立循环),但通常你必须做数学。阅读一本描述复杂性分析方法的书可能比随机挑选困难的例子和猜测哪些方法可能有效更有帮助。这里时间复杂度的递归关系将为您提供 not O(3^n) 的 Tribonacci 数。

标签: python recursion time-complexity


【解决方案1】:

由于函数调用了函数3次

这并不完全正确,而是让我们使用比您的临时示例更准确的示例。

def constant(n):
    return n*12301230

这将始终在相同的时间内运行,因此是 O(1)

def linear(n):
    total = 0
    for x in xrange(n):
        total+=1
    return total

这有 O(N) 时间

def quadratic(n):
    total = 0
    for x in xrange(n):
        for y in xrange(n):
             total+=1
    return total

因为内循环运行 n 次,外循环运行 n 次,所以它以二次时间 O(N^2) 运行。

log(N)、N*log(N)、(2^N) 等还有更具体的例子,但是,回到你的问题:

既然函数调用了函数3次,那是否意味着时间复杂度是O(3^n)?

如果函数被调用 3 次,constant(x) 仍然是常数时间,linear(x) 是线性时间,quadratic(x) 是二次函数。重要的是,O(3^n) 是指数时间,与 n^3 不同。那么,我们不会以 3 为基数,而是以 2^n 为标准。

所以你的函数对于 x

希望这会有所帮助,该图并不能说明 2^n 与 n^2 相比增长了多少,但这是一个好的开始。

【讨论】:

  • return n*12301230 必须至少读取 n 的每一位,因此它的运行时间将为 Θ(length(n))。​ ​
猜你喜欢
  • 1970-01-01
  • 2020-06-07
  • 2011-03-28
  • 2021-09-06
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多