对复杂性感到困惑

时间:2014-04-09 15:36:50

标签: python python-3.x time-complexity

我试图找到max1和max2的时间复杂度。

def max1(L,left,right):
    if left==right:
        return L[left]
    return max(L[left], max1(L,left+1,right))

def max2(L, left, right):
    if left==right:
        return L[left]
    mid = (left+right)//2
    l = max2(L, left, mid)
    r = max2(L, mid+1, right)
    return max(l,r)

def max_list(L):
    return max1(L,0,len(L)-1)# or max2(L,0,len(L)-1)

从我看来是Max1:
深度是O(n)。递归的每个级别我们做O(n-k)。总的来说,复杂性是O(n ^ 2)。我在某处读到这里的复杂性是O(n)。谁对吗?

MAX2:
深度是O(logn)。每个步骤我为每个列表做O(1)并且每个步骤O(n) 所以我认为Max2是O(n)* O(logn)= O(nlogn)。不知怎的,我读到它是O(n)。谁对谁?

1 个答案:

答案 0 :(得分:2)

根据递归关系定义递归复杂性非常重要。

对于您的第一个算法,您有

T(n) = T(n-1) + O(1)

这意味着你会做一些不断的工作,并将你的设置大小减少1并递归调用自己。这将产生一个深度为n的递归树,其中每个父级只有一个子级(您可以将其视为一条直线),由于工作量不变,您可以看到它是O(n)

enter image description here

对于第二种算法,你有

T(n) = 2T(n/2) + O(1)

假设您将输入分成两半并递归调用两次,并做一些不断的工作。在这种情况下,您可以使用master thereom来显示O(n)