这不是获得Fibonacci序列号的最有效方法,但我正在学习Big O,并希望确认和解释下面代码的空间和时间效率。代码是在Python中,我编写它,以便我使用一个列表并附加到它,只返回最后一个值。
append方法需要O(1)时间,如here所示,但我的操作几乎是n次,所以我会得到O(n)的时间复杂度?
关于空间复杂性,我是否应该将空间视为arithmetic series,因为如果输入的数字大于开头时给予函数堆栈的数量,则必须将列表移动到其他地方? / p>
此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))
答案 0 :(得分:1)
时间复杂度:O(n)
因为您正在执行具有恒定时间复杂度的循环n
次。
空间复杂度:O(n)
因为您在列表中存储了n
个号码。
当然,您并不需要存储所有数字,只能存储最后两个数值。这会将空间复杂度降低到O(1)
。