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)
。该问题要求解决a
和b
。由于矩阵乘法,我将其收集为b = 3。但是,什么是?你能给我个提示吗?谢谢!
答案 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 。