我有一些困难证明了这两个递归代码的复杂性。我对他们有一些直觉。我认为第一个是O(n),第二个是O(nlogn)。这些是代码:
def max_v1(lst):
if len(lst)== 1:
return lst[0]
return max(lst[0], max_v1(lst[1:]))
def max_v2(lst):
if len(lst)== 1:
return lst[0]
l = max_v2(lst[:len(lst)//2])
r = max_v2(lst[len(lst)//2:])
return max(l, r)
答案 0 :(得分:4)
def max_v1(lst):
if len(lst)== 1:
return lst[0]
return max(lst[0], max_v1(lst[1:]))
max(...)
是O(2),每max_v1
个函数调用调用一次,但每个函数调用的切片为O(N)。因此,我们得到O(2 * N * N)= O(N 2 )。
def max_v2(lst):
if len(lst)== 1:
return lst[0]
l = max_v2(lst[:len(lst)//2])
r = max_v2(lst[len(lst)//2:])
return max(l, r)
每max_v2
个函数调用调用 max_v2
两次,每次传递list
的一半,产生O(2 * N * log(N)),由于切片和函数调用。每个函数调用调用max()
一次,因此总共给出N * O(2)= O(N)。因此,我们得到O(N + 2 * N * log(N))= O(N * log(N))。
答案 1 :(得分:-2)
这两个功能似乎是等效的。考虑abcd
。第一个版本进行了3次比较:
a <-> max(bcd)
b <-> max(cd)
c <-> d
第二个也是如此:
max(ab) <-> max(cd)
a <-> b
c <-> d
因此,两个版本进行N-1比较,O(N)
。