matrix_multiply(A,B,C,n)
for i = 1 to n
for j = 1 to n
for k = 1 to n
C[i][j] = C[i][j] + A[i][k] * B[k][j]
时间复杂度为 Θ(n3)
(C11C21C12C22)=(A11A21A12A22)(B11B21B12B22)=(A11⋅B11+A12⋅B21A21⋅B11+A22⋅B21A11⋅B12+A12⋅B22A21⋅B12+A22⋅B22)
matrix_multiply_recursive(A,B,C,n)
if n == 1
// Base case.
C[1][1] = C[1][1] + A[1][1] * B[1][1]
return
// Divide.
partition A,B,and C into n/2 x n/2 submatrices
// Conquer.
matrix_multiply_recursive(A₁₁,B₁₁,C₁₁,n/2)
matrix_multiply_recursive(A₁₁,B₁₂,C₁₂,n/2)
matrix_multiply_recursive(A₂₁,B₁₁,C₂₁,n/2)
matrix_multiply_recursive(A₂₁,B₁₂,C₂₂,n/2)
matrix_multiply_recursive(A₁₂,B₂₁,C₁₁,n/2)
matrix_multiply_recursive(A₁₂,B₂₂,C₁₂,n/2)
matrix_multiply_recursive(A₂₂,B₂₁,C₂₁,n/2)
matrix_multiply_recursive(A₂₂,B₂₂,C₂₂,n/2)
时间复杂度为
T(n)=8T(n/2)+Θ(1)=Θ(n3)
提示
基本思想是将子问题从8次矩阵乘法减少到7次,代价是4次矩阵加法增加到18次,从而降低了总的时间复杂度
时间复杂度为
T(n)=7T(n/2)+Θ(n2)=Θ(nlg7)=O(n2.81)
提示
替换法主要分为两个步骤:1. 猜测 2. 使用数学归纳法进行证明
下面我们使用替换法来计算以下这个递归的时间复杂度
T(n)=2T(⌊n/2⌋)+Θ(n)
- 猜测
T(n)=O(nlgn)
- 证明
当 n >= 2n₀ 时有
T(n)≤2c⌊n/2⌋lg(⌊n/2⌋)+Θ(n)≤2c(n/2)lg(n/2)+Θ(n)=cnlg(n/2)+Θ(n)=cnlgn−cn+Θ(n)≤cnlgn
只要 c 取得足够大,就能保证最后的不等式成立
同样使用以下这个递归来演示递归树法是如何计算时间复杂度的
T(n)=3T(n/4)+Θ(n2)
提示
对于递归等式 T(n) = aT(n/b) + f(n), 其中 a > 0, b > 1 且对于任意大n满足f(n)非负,其时间复杂度计算可以根据以下情况分类
- 如果存在ε>0使得
f(n)=O(nlogba−ϵ)
则
T(n)=Θ(nlogba)
- 如果存在k >= 0 使得
f(n)=Θ(nlogbalgkn)
则
T(n)=Θ(nlogbalgk+1n)
- 如果存在ε>0使得
f(n)=Ω(nlogba+ϵ)
并且f(n)满足 af(n/b) <= cf(n),其中 c < 1, 则
T(n)=Θ(f(n))
提示
Akra-Bazi是主方法的一般化形式,用于解决如下的递归等式
T(n)=i=1∑kaiT(n/bi)+f(n)
当f(n)满足多项式成长的条件,则
T(n)=Θ(np(1+∫1nxp+1f(x)dx))
其中 p 满足
i=1∑kbipai=1