特定重复算法的时间复杂度

时间:2018-04-19 15:08:22

标签: algorithm recursion time-complexity

如何才能找到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是数组中元素的数量?

1 个答案:

答案 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的幂。这是处理分而治之阵列算法的常用近似值。