递归调用复杂性

时间:2013-12-07 09:48:06

标签: python recursion complexity-theory

我有一些困难证明了这两个递归代码的复杂性。我对他们有一些直觉。我认为第一个是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)

2 个答案:

答案 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)