分治算法时间复杂度计算(主定理)

在计算机科学中,主定理(Master Theorem)用于解决递归关系的渐进界。特别是在分析分治算法的复杂度时,主定理提供了一种简便的方法来确定递归方程的时间复杂度。主定理主要适用于以下形式的递归关系:
T ( n ) = a × T ( n b ) + f ( n ) T(n) = a \times T(\frac{n}{b}) + f(n) T(n)=a×T(bn)+f(n)
其中:

  • a ≥ 1 a \geq 1 a1,且是子问题的数量,
  • b > 1 b>1 b>1且是每个子问题的规模减小的因子,
  • f ( n ) f(n) f(n)是在分解和合并子问题时花费的时间。

主定理分为三种情况:

  1. 情况1:如果 f ( n ) = O ( n c ) f(n) = O(n^c) f(n)=O(nc) 其中 c < log ⁡ b a c < \log_b{a} c<logba,那么:
    T ( n ) = Θ ( n log ⁡ b a ) T(n) = \Theta(n^{\log_b{a}}) T(n)=Θ(nlogba)

  2. 情况2:如果 f ( n ) = Θ ( n c ) f(n) = \Theta(n^c) f(n)=Θ(nc) 其中 c = log ⁡ b a c = \log_b{a} c=logba,那么:
    T ( n ) = Θ ( n c log ⁡ n ) = Θ ( n log ⁡ b a log ⁡ n ) T(n) = \Theta(n^c \log n) = \Theta(n^{\log_b{a}} \log n) T(n)=Θ(nclogn)=Θ(nlogbalogn)

  3. 情况3:如果 f ( n ) = Ω ( n c ) f(n) = \Omega(n^c) f(n)=Ω(nc) 其中 c > log ⁡ b a c > \log_b{a} c>logba,并且对于某个常数 ϵ > 0 \epsilon > 0 ϵ>0,有 a f ( n b ) ≤ k f ( n ) af\left(\frac{n}{b}\right) \leq kf(n) af(bn)kf(n) 对于足够大的 n n n 成立,其中 k < 1 k < 1 k<1,那么:
    T ( n ) = Θ ( f ( n ) ) T(n) = \Theta(f(n)) T(n)=Θ(f(n))

上面所说的情况其实很简单,计算出来分解子问题的时间复杂度后,将其与合并子问题的时间复杂度进行比较。

如果合并子问题的时间复杂度,即 f ( n ) f(n) f(n),更高,即为情况一,最终的时间复杂度直接取 f ( n ) f(n) f(n)
等于,即为情况二,最终的时间复杂度为 O ( f ( n ) ∗ log ⁡ n ) O(f(n) * \log n) O(f(n)logn)
如果计算分解子问题的时间复杂度高,即为情况三。最终的时间复杂度为 O ( n log ⁡ b a ) O(n^{\log_b a}) O(nlogba)

例子

假设我们有一个递归关系:
T ( n ) = 2 T ( n 2 ) + n T(n) = 2T\left(\frac{n}{2}\right) + n T(n)=2T(2n)+n

我们来分析这个递归关系:

  • a = 2 a = 2 a=2
  • b = 2 b = 2 b=2
  • f ( n ) = n f(n) = n f(n)=n

计算 log ⁡ b a \log_b{a} logba:
log ⁡ 2 2 = 1 \log_2{2} = 1 log22=1

现在比较 f ( n ) f(n) f(n) n log ⁡ b a n^{\log_b{a}} nlogba:

  • f ( n ) = n f(n) = n f(n)=n
  • n log ⁡ 2 2 = n 1 = n n^{\log_2{2}} = n^1 = n nlog22=n1=n

这属于主定理的情况2,因为 f ( n ) f(n) f(n) n log ⁡ b a n^{\log_b{a}} nlogba 是相等的。因此:
T ( n ) = Θ ( n log ⁡ n ) T(n) = \Theta(n \log n) T(n)=Θ(nlogn)

例子2

T ( n ) = T ( 2 n 3 ) + 1 T(n) = T(\frac {2n}3) + 1 T(n)=T(32n)+1
分析
a = 1, b = 3/2, f(n) = 1
l o g 3 2 1 = 0 log_{\frac{3}2}{1} = 0 log231=0 ,所以 O ( n 0 ) = O ( 1 ) O(n^0) = O(1) O(n0)=O(1),
也即二者相等,情况二,所以最终时间复杂度:
T ( n ) = O ( 1 ∗ l o g n ) = O ( l o g n ) T(n) = O(1 * log n) = O(logn) T(n)=O(1logn)=O(logn)

  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值