我正在为考试而学习,问题如下。给定功能:
def foo(lst):
count = 0
while len(lst)>1:
mid = len(lst)//2
lst = lst[:mid]
count += lst[-1]
return count
它的运行时复杂度是什么?
据我了解,由于每次将列表切成两半,因此外部while循环将运行logn
次。切片是O(n)活动,因此,运行时为nlogn
。不幸的是,答案声称运行时间为O(n)。我哪里出错了?
答案 0 :(得分:2)
简短答案:切片列表以 O(n)运行,但是由于该列表每次都切成两半,因此表示 n < / em>在第二个迭代中是前一个的一半。
如果切片到 k 恰好采用了 k “指令”,则表示算法归结为 n / 2 + n / 4 + n / 8 + ... + 1 ,或更正式的形式:
document.cookie = "cookieNameAsString='cookieValue'; max-age=time;";
上面的geometric serie [wiki]等于:
log n
--- n
\ ---
/ i
--- 2
i=1
所以指令的总数是 O(n)。