函数的时间复杂度分析,Big O.

时间:2013-01-13 11:53:04

标签: algorithm

以下代码在参数大小方面的时间复杂度是多少?激励。

// Process(A, N) is O(sqrt(N)). 

Function Complex(array[], size){
    if(size == 1) return 1;
    if(rand() / float(RAND_MAX) < 0.1){
        return Process(array, size*size)
             + Complex(array, size/2)
             + Process(array, size*size);
    }
}

我认为它是O(N),因为如果Process(A,N)是O(sqrt(N)),那么Process(A,N * N)应该是O(N)和Complex(数组, size / 2)是O(log(n)),因为它每次运行时都会减小一半。所以一次运行需要O(N)+ O(log(N))+ O(N)= O(N)。

请纠正我并给我一些提示,告诉我如何思考/进行这样的任务。

我非常感谢所有人的帮助和感谢。

1 个答案:

答案 0 :(得分:0)

算法的时间复杂度确实是O(N),但原因不同。

函数的复杂性可以表示为T(n)其中:

T(n) = T(n/2)       +       2*n
        ^                   ^
      recursive          2 calls to 
      invokation        Process(arr,n*n),
                          each is O(n(

众所周知,这种递归是O(n):

T(n) = T(n/2) + 2*n = 
     = T(n/4) + 2*n/2 + 2*n = 
     = T(n/8) + 2*n/4 + 2*n/2 + 2*n
     = ....
     = 2*n / (2^logN) + ... + 2*n/2 + 2*n
     < 4n
     in O(n)

让我们正式证明,我们将使用数学归纳法:

基础: T(1)&lt; 4(检查)
假设:对于n,对于每个k<n,声明T(k) < 4k都适用。
对于n

T(n) = T(n/2) + n*2 = (*) 
     < 2*n + 2*n 
     = 4n

结论T(n)位于O(n)

(*)来自归纳假设