我试图找到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)。谁对谁?
答案 0 :(得分:2)
根据递归关系定义递归复杂性非常重要。
对于您的第一个算法,您有
T(n) = T(n-1) + O(1)
这意味着你会做一些不断的工作,并将你的设置大小减少1并递归调用自己。这将产生一个深度为n
的递归树,其中每个父级只有一个子级(您可以将其视为一条直线),由于工作量不变,您可以看到它是O(n)
对于第二种算法,你有
T(n) = 2T(n/2) + O(1)
假设您将输入分成两半并递归调用两次,并做一些不断的工作。在这种情况下,您可以使用master thereom来显示O(n)
。