最近看分治法,那我们就一起研究下分治法的时间复杂度吧。
分治法是将问题分解为语言问题等价的规模相等的子问题进行求解的过程。因此根据定义可知,如果原问题为A该问题被分解为K个子问题,则子问题应该为A/k。同时当子问题被解决之后,对子问题还应该有一个合并的过程,让子问题被重新归纳为原问题。规范的描述过程应该是:
1、原问题为A
2、划分子问题A/k
3、解决子问题
4、归并子问题
设解决子问题被解决需要的时间复杂度为O(1),归并规模为n的子问题需要的时间复杂度为f(n),则该过程的时间复杂度应该可以使用递归公式T(A) = T(A/k) + f(n)
T(A) – kT(A/k) = f(A) (1)式
T(A/k) – kT(A/k*k) = f(A/2) (2)式
(1)式 + k(2)式 可得:
T(A) + k*k*T(A/k*K) = f(A) + k*f(A/2)
重复该过程可知: T(A) – power(K,logk A) * T(1) = [1,k,k*k,…… power(K,logk A)-1]*([f(A), f(A/k),……f(A/power(K,logk A)-1]的转置矩阵)
因为设f(A) = O(A)则K* f(A/k) = k * O(A/k) = O(A)
即 T(A) = A * T(1) + (logk A)O(A)
将T(1)得复杂度代入即可得到具体的总体时间复杂度值。