递归算法的时间复杂度

时间:2019-04-30 20:32:50

标签: python algorithm recursion time-complexity big-o

A是一个n×n矩阵。考虑一个返回以下内容的函数algo(A)

def algo(A):
    return algo(A[:n//2, :n//2]) + algo(A[:n//2, n//2:]) + algo(A[n//2:, :n//2]) + \
           algo(A[n//2:, n//2:]) + A.transpose() * A

时间复杂度的公式为O(log(a*n) + n^b)。该问题要求解决ab。由于矩阵乘法,我将其收集为b = 3。但是,什么是?你能给我个提示吗?谢谢!

2 个答案:

答案 0 :(得分:0)

如果A的大小为N = n^2,那么如果在简单情况下进行乘法,则algo的时间复杂度为T(N) = 4T(N/4) + N^1.5(我的意思是我们可以使用更聪明的东西,例如Strassen算法)。现在,根据主定理,我们知道T(N) = \Theta(N^1.5) = \Theta(n^3)

因此,a可以是任何常数。

答案 1 :(得分:0)

首先,我们考虑矩阵乘法需要O(n ^ 3)。

我们总是叫algo,我们用四分之一的A再次称呼它。

    T(algo(A))
        |___________
        | | | |     |       
1.     algo(A/4)  O(n³) = 4T(algo(A/4)) + O(n^3)
2.        .
...       .
log(n).   .

在第1行,我们有4个呼叫,在第2行,有16个呼叫,在 i 行,我们有4 ^(i)个呼叫。

算法呼叫的总数为 C = 4 ^ 1 + ... + 4 ^ log (n),因为每次行,我们将前一行的调用乘以4,因此可以将其绑定到:

C = 4^log(n)
C = log(x)      so 2^x = 4^log(n) = 2^(2*log(n))
C = log( 2*log(n) )

总复杂度为O(Cn³),因为每个调用都执行O(n³)操作。

如果总复杂度为O( log (a * n)+ n ^ b)的形式,则可以简化:

O( log (2 log (n))*n³)= O([1 + log log < / em>(n))]n³)= O(n³+ log log (n))n³)。

由于n³在 log 函数之外,我们可以强制其进入:

O(n³+ log log (n))n³)= O(n³+ log log (n)* 2 ^(n ^ 3)))。

如果 log log (n)* 2 ^(n ^ 3))= a * n,

a = [ log log (n)* 2 ^(n ^ 3))] / n

b = 3