【问题标题】:Fibonacci sequence time and space complexity斐波那契数列时间和空间复杂度
【发布时间】:2018-04-14 14:51:07
【问题描述】:

这不是获取斐波那契数列的最有效方法,但我正在学习 Big O,并希望确认和解释以下代码的空间和时间效率。代码是用 Python 编写的,我编写它以便我使用一个列表并附加到它并返回最后一个值。

append 方法需要 O(1) 时间,如 here 所示,但我正在执行该操作几乎 n 次,所以我会得到 O(n) 的时间复杂度吗?

关于空间复杂度,我是否应该考虑将空间用作arithmetic series,因为如果输入的数字大于开头给函数堆栈的数字,则必须将列表移动到其他位置?

question 中的代码用于递归方法。

def getFib(position):
  if position == 0:
    return 0
  if position == 1:
    return 1

  list_ = [0, 1]
  previous = 1

  for pos in range(2, position+1):
    list_.append(list_[pos-1] + list_[pos-2])

  return list_[position]

if __name__ == "__main__":
  print(getFib(0))
  print(getFib(1))
  print(getFib(2))
  print(getFib(3))
  print(getFib(4))
  print(getFib(5))
  print(getFib(6))
  print(getFib(7))
  print(getFib(8))
  print(getFib(9))

【问题讨论】:

  • 这是 O(n) 时间和空间复杂度?您正在从0 to n 执行for 循环。每次添加新项目时。
  • 您有一个循环,该循环采用position 步骤并创建大小为position 的列表。看起来很简单。

标签: python big-o


【解决方案1】:

时间复杂度:O(n),因为您正在执行 n 乘以具有恒定时间复杂度的循环。

空间复杂度:O(n),因为您将 n 数字存储在列表中。

当然,您不需要存储所有数字,只需要存储最后两个值。这会将空间复杂度降低到O(1)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
相关资源
最近更新 更多