🐋
Blog
算法
算法
  • 算法
  • 基础
    • 高精度
    • 二分
    • 位运算
    • 贪心
    • KMP
    • Master Theorem
    • 前缀和 & 差分
    • sort
    • 双指
  • 数据结构
    • 数据结构模拟
  • 数学
    • 组合数
    • 约数
    • 欧拉函数
    • 扩展欧几里得
    • 高斯消元
    • 容斥原理
    • 线性筛
    • 快速幂
  • 动态规划
    • 背包
    • 字符串匹配
    • 区间DP
  • 图论
    • BFS
    • DFS
由 GitBook 提供支持
在本页
  1. 基础

Master Theorem

上一页KMP下一页前缀和 & 差分

最后更新于2年前

前言

  • 在介绍主定理之前,需要了解一下关于表示时间复杂度的几种形式。

  • O(big−O)O(big-O)O(big−O) 表示最坏时间复杂度,为上界。

  • Ω(big−Omega)\Omega(big-Omega)Ω(big−Omega) 表示最优时间复杂度,为下界。

  • Θ(big−Theta)\Theta(big-Theta)Θ(big−Theta) 表示确界,当上界和下届相同时,可以用这个来表示时间复杂度。

主定理

主定理主要解决递归式的时间复杂度计算。但并不能解决所有的递归式。主要适用如下递归式:

T(n)=aT(nb)+f(n)T(n) = aT({n \over b}) + f(n)T(n)=aT(bn​)+f(n)
  • nnn 是问题规模。

  • aaa 为递归的子问题。

  • nb{n \over b}bn​ 为每个子问题的规模。

  • f(n)f(n)f(n) 为递归以外的计算量。

三种 case

  • 主定理的结果主要跟 f(n)f(n)f(n) 有关。

  • 当 f(n)=O(n(log⁡ba)−ϵ)f(n) = O(n^{(\log_ba) - \epsilon})f(n)=O(n(logb​a)−ϵ) 其中 ϵ>0\epsilon > 0ϵ>0 (相当于 log⁡ba>f(n)\log_ba > f(n)logb​a>f(n)),则有 T(n)=Θ(nlogba)T(n) = \Theta(n^{log_ba})T(n)=Θ(nlogb​a)。

  • 当 f(n)=Θ(nlog⁡ba)f(n) = \Theta(n^{\log_ba})f(n)=Θ(nlogb​a),则有T(n)=Θ(nlog⁡balog⁡n)T(n) = \Theta(n^{\log_ba}\log n)T(n)=Θ(nlogb​alogn)。

  • 当 f(n)=Ω(n(log⁡ba)+ϵ)f(n) = \Omega(n^{(\log_ba) + \epsilon})f(n)=Ω(n(logb​a)+ϵ) 其中 ϵ>0\epsilon > 0ϵ>0 (相当于log⁡ba<f(n)\log_ba < f(n)logb​a<f(n)),则有 T(n)=Θ(f(n))T(n) = \Theta(f(n))T(n)=Θ(f(n))

简化版本

总结

计算递归时间复杂度的话,一般两种方法,画递归树手算和用主定理,具体情况具体分析。

如果 T(n)=aT(nb)+O(nd)T(n) = aT({n \over b}) + O(n^d)T(n)=aT(bn​)+O(nd)(其中 a>0,b>1,d≥0a > 0, b > 1, d \ge 0a>0,b>1,d≥0),则有

T(n)={O(nd)if d>log⁡baO(ndlog⁡n)if d=log⁡baO(nlogba)if d<log⁡baT(n) = \begin{cases} O(n^d) &if\ d > \log_ba \\ O(n^d\log n) &if\ d = \log_ba\\ O(n^{log_ba}) &if\ d < \log_ba \end{cases}T(n)=⎩⎨⎧​O(nd)O(ndlogn)O(nlogb​a)​if d>logb​aif d=logb​aif d<logb​a​