如何才能找到sum1
的时间复杂度?
func sum1(x []int) int {
// Returns the sum of all the elements in the list x.
return sum(x, 0, len(x)-1)
}
func sum(x []int, i int, j int) int {
// Returns the sum of the elemets from x[i] to x[j]
if i > j {
return 0
}
if i == j {
return x[i]
}
mid := (i + j) / 2
return sum(x, i, mid) + sum(x, mid+1, j)
}
此特定算法所需的步骤数量是否正确
T(n)= 1 + 2*T(n/2)
?
其中n
是数组中元素的数量?
答案 0 :(得分:0)
i>j
情况永远不会通过sum1
发生,除非用户传入一个空列表,所以让我们忽略它来计算时间复杂度。
否则对sum(x[], i, j)
的调用会返回x
的元素,或者将其添加到一起。如果结果是x[i]+x[i+1]+...+x[j]
的总和,那么必须是j-i+1
个案例返回x
元素,j-i
个案例执行添加。因此,2j-2i+1
必须总共sum
次调用,因此sum1
的复杂度为O(len(x))。
请注意,这段代码毫无意义 - 它只是一个非常复杂且开销很大的方法,与天真代码for i = 0..n-1 {sum += x[i]} return sum
做同样的事情(*)。 (*)假设加法是关联的。
如果你想要一个T(n)的递归公式(其中n是j-i + 1),那么它的T(1)= 1,T(n)= T(floor(n / 2))+ T (ceil(n / 2))+ 1.如果用T(n)= 2T(n / 2)+1来近似它,你会得到正确的复杂性,但它不是相当正确除非你声明n是2的幂。这是处理分而治之阵列算法的常用近似值。