好的,因为这是家庭作业:
这是代码:
def f2(L):
sum = 0
i = 1
while i < len(L):
sum = sum + L[i]
i = i * 2
return sum
它显然取决于 len(L)。
所以让我们看看每一行,它的成本是多少:
sum = 0
i = 1
# [...]
return sum
这些显然是恒定的时间,与 L 无关。在循环中,我们有:
sum = sum + L[i] # time to lookup L[i] (`timelookup(L)`) plus time to add to the sum (obviously constant time)
i = i * 2 # obviously constant time
循环执行了多少次?它显然取决于 L 的大小。让我们称之为loops(L)
所以我们得到了一个整体的复杂性
loops(L) * (timelookup(L) + const)
作为一个好人,我会告诉你列表查找在 python 中是不变的,所以它归结为
O(loops(L))
(忽略常量因素,正如 big-O 约定所暗示的那样)
你多久循环一次,len()
基于L
?
(a) 与列表中的项目一样频繁 (b) 与列表中的项目一样频繁?
(c) 较少,因为列表中的项目 (d) 比 (b) 更频繁?