前言

虽说在学OI的时候学到了非常多的有递归结构的算法或方法,也很清楚他们的复杂度,但更多时候只是能够大概脑补这些方法为什么是这个复杂度,而从未从定理的角度去严格证明他们。因此借着这个机会把主定理整个梳理一遍。

介绍

主定理(Master Theorem)提供了用于分析一类有递归结构算法时间复杂度的方法。这种递归算法通常有这样的结构:

def solve(problem):
solve_without_recursion()
for subProblem in problem:
solve(subProblem)

我们可以用一种表示方式来概括这些结构的算法:对于一个规模为\(n\)的问题,我们把它分为\(a\)个子问题,每个子问题规模为\(\frac nb\)。那么这种方法的复杂度\(T(n)\)可以表示为:

\[T(n)=a\,T\Big(\frac nb\Big)+f(n)
\]

其中\(a\ge 1,b>1\)为常数,\(\frac{n}{b}\)指\(\lfloor \frac{n}{b}\rfloor\)或\(\lceil \frac{n}{b}\rceil\),\(f(n)\)为创造这些递归或者将这些子问题结果整合的函数。对这个方法我们可以建一个递归树:

其中树高为\(\log_bn\),树的第\(i\)层有\(a^i\)个节点,每个节点的问题规模为\(\frac{n}{b^i}\)。则这棵树有\(a^{\log_bn}=n^{\log_ba}\)个叶子节点。因此这种方法的复杂度也可以表示为:

\[T(n)=\Theta(n^{\log_ba})+\sum_{i=0}^{\log_bn-1}a^if\Big(\frac{n}{b^i}\Big)
\]

从中我们可以看出,整个方法的复杂度取决于\(f(n)\)的复杂度。主定理对\(f(n)\)分了三种情况:

  1. \(\exist \varepsilon>0\ s.t.\ f(n)=O(n^{\log_ba-\varepsilon})\)。此时\(T(n)=\Theta(n^{\log_ba})\)。
  2. \(f(n)=\Theta(n^{\log_ba})\)。此时\(T(n)=\Theta(n^{\log_ba}\lg n)\)。
  3. \(\exist \varepsilon>0\ s.t.\ f(n)=\Omega(n^{\log_ba+\varepsilon})\),且\(\exist c<1\),当\(n\)足够大时,有\(a\, f(\frac{n}{b})\le c\, f(n)\)。此时\(T(n)=\Theta(f(n))\)。

\(f(n)\)含\(\log\)的情况类似,待补充。

证明

Case 1

令\(g(n)=\sum_{i=0}^{\log_bn-1}a^if(\frac{n}{b^i})\),由\(f(n)=O(n^{\log_ba-\varepsilon})\),得:

\[g(n)=O\Big(\sum_{i=0}^{\log_bn-1}a^i\Big(\frac{n}{b^i}\Big)^{\log_ba-\varepsilon}\Big)
\]

之后就是对后面式子的化简:

\[\begin{aligned}
\sum_{i=0}^{\log_bn-1}a^i\Big(\frac{n}{b^i}\Big)^{\log_ba-\varepsilon} &= n^{\log_ba-\varepsilon}\sum_{i=0}^{\log_bn-1}\Big(\frac{ab^\varepsilon}{b^{\log_ba}}\Big)^i\\
&= n^{\log_ba-\varepsilon}\sum_{i=0}^{\log_bn-1}(b^\varepsilon)^i\\
&= n^{\log_ba-\varepsilon}\Big(\frac{(b^\varepsilon)^{\log_bn}-1}{b^\varepsilon-1}\Big)^i\\
&= n^{\log_ba-\varepsilon}\Big(\frac{n^\varepsilon-1}{b^\varepsilon-1}\Big)^i
\end{aligned}
\]

因此\(g(n)=O(\sum_{i=0}^{\log_bn-1}a^i(\frac{n}{b^i})^{\log_ba-\varepsilon})=O(n^{\log_ba})\)。所以有:

\[T(n)=\Theta(n^{\log_ba})+O(n^{\log_ba})=\Theta(n^{\log_ba})
\]

Case 2

同Case 1。令\(g(n)=\sum_{i=0}^{\log_bn-1}a^if(\frac{n}{b^i})\)得:

\[g(n)=\Theta\Big(\sum_{i=0}^{\log_bn-1}a^i\Big(\frac{n}{b^i}\Big)^{\log_ba}\Big)
\]

继续化简:

\[\begin{aligned}
\sum_{i=0}^{\log_bn-1}a^i\Big(\frac{n}{b^i}\Big)^{\log_ba} &= n^{\log_ba}\sum_{i=0}^{\log_bn-1}\Big(\frac{a}{b^{\log_ba}}\Big)^i\\
&= n^{\log_ba}\log_bn
\end{aligned}
\]

因此可得\(g(n)=n^{\log_ba}\log_bn=n^{\log_ba}\lg n\)。所以有:

\[T(n)= \Theta(n^{\log_ba})+\Theta(n^{\log_ba}\lg n)=\Theta(n^{\log_ba}\lg n)
\]

Case 3

还是令\(g(n)=\sum_{i=0}^{\log_bn-1}a^if(\frac{n}{b^i})\)。但Case 3这里有一个条件:\(a\, f(\frac{n}{b})\le c\, f(n)\)。我们对这个条件做一下处理:

\[\begin{aligned}
a\, f\Big(\frac{n}{b}\Big) &\le c\, f(n)\\
\Rightarrow f\Big(\frac{n}{b}\Big) &\le \frac{c}{a}f(n)\\
\Rightarrow f\Big(\frac{n}{b^2}\Big) &\le \frac{c}{a}f\Big(\frac nb\Big)\le\Big(\frac{c}{a}\Big)^2f(n)\\
&\vdots\\
f\Big(\frac{n}{b^i}\Big) &\le\Big(\frac{c}{a}\Big)^if(n)\\
\Rightarrow a^i\, f\Big(\frac{n}{b^i}\Big) &\le c^i\, f(n)\\
\end{aligned}
\]

由此我们可以很轻易的向下化简:

\[\begin{aligned}
\sum_{i=0}^{\log_bn-1}a^i\Big(\frac{n}{b^i}\Big)^{\log_ba} &\le \sum_{i=0}^{\log_bn-1}c^i\,f(n)+O(1)\\
&\le f(n)\sum_{i=0}c^i+O(1)\\
&=f(n)\Big(\frac{1}{1-c}\Big)+O(1)\\
&=f(n)
\end{aligned}
\]

得\(g(n)=O(f(n))\)。又因为\(g(n)=\sum_{i=0}^{\log_bn-1}a^if(\frac{n}{b^i})\ge f(n)\),得\(g(n)=\Omega(f(n))\)。因此\(g(n)=\Theta(f(n))\)。

所以有:

\[T(n)=\Theta(n^{\log_ba})+\Theta(f(n))=\Theta(f(n))
\]

证毕。

应用

二叉树建树

\[T(n)=2T\Big(\frac{n}{2}\Big)+O(1),\ T(n)=O(n)
\]

此时\(\log_ba<1\),满足Case 1。

BFPRT(Median of Medians)

\[T(n)\le T\Big(\frac{n}{5}\Big)+\Big(\frac{7n}{10}\Big)+O(n),\ T(n)=O(n)
\]

此时\(\log_ba>1\),即划分之后总规模减小(\(1/5+7/10<1\)),满足Case 2。

归并排序

\[T(n)=2T\Big(\frac{n}{2}\Big)+O(n),\ T(n)=O(\lg n)
\]

此时\(\log_ba=1\),满足Case 3。

对主定理(Master Theorem)的理解的更多相关文章

  1. 算法设计与分析 - 主定理Master theorem (分治法递推时间复杂度)

    英文原版不上了 直接中文 定义 假设有递推关系式T(n)=aT(n/b)+f(n) 其中n为问题规模 a为递推的子问题数量 n/b为每个子问题的规模(假设每个子问题的规模基本一样) f(n)为递推以外 ...

  2. 主定理(Master Theorem)与时间复杂度

    1. 问题 Karatsuba 大整数的快速乘积算法的运行时间(时间复杂度的递推关系式)为 T(n)=O(n)+4⋅T(n/2),求其最终的时间复杂度. 2. 主定理的内容 3. 分析 所以根据主定理 ...

  3. 重新粗推了一下Master Theorem

    主定理一般形式是T(n) = a T(n / b) + f(n), a >= 1, b > 1.递归项可以理解为一个高度为 logbn 的 a 叉树, 这样 total operation ...

  4. 答:SQLServer DBA 三十问之二:系统DB有哪些,都有什么作用,需不需要做备份,为什么;损坏了如何做还原(主要是master库)

    2. 系统DB有哪些,都有什么作用,需不需要做备份,为什么:损坏了如何做还原(主要是master库): master:它包含一个系统表集合,是整个实例的中央存储库,维护登录账户,其他数据库,文件分布, ...

  5. Master Theorem

    Master theorem provides a solution in asymptotic terms to solve time complexity problem of most divi ...

  6. 确界原理 supremum and infimum principle 戴德金定理 Dedekind theorem

    确界原理  supremum and infimum principle  戴德金定理  Dedekind theorem http://www.math.ubc.ca/~cass/courses/m ...

  7. [BZOJ4007][JLOI2015]战争调度(DP+主定理)

    第一眼DP,发现不可做,第二眼就只能$O(2^{1024})$暴搜了. 重新审视一下这个DP,f[x][i]表示在x的祖先已经全部染色之后,x的子树中共有i个参战平民的最大贡献. 设k为总结点数,对于 ...

  8. 旋度定理(Curl Theorem)和散度定理(Divergence theorem)

    原文链接 首先说说格林公式(Green's theorem).对于一段封闭曲线,若其围城的区域D为单连通区域(内部任意曲线围城的区域都属于院区域),则有如下公式: 其中其中L为D的边界,取正方向.如果 ...

  9. O、Θ、Ω&主定理

    1.这些是时间复杂度的.(e.g. O(n).Θ(n).Ω(n)) 主要为主定理(坏东西) 2.本质 O <= Θ = Ω >= 3.(你可以把他们都试一遍)主要用处(目前,2020-09 ...

随机推荐

  1. [jQuery]jQuery和DOM对象互换(四)

    DOM 和 jQuery 相互转换 DOM 转jQuery $(DOM对象) # (1)直接获取 $('video'); # (2)转换 $(DOM对象) var myVideo = document ...

  2. Ubuntu下LAMP的环境配置教程

    总体来说,Ubuntu下安装LAMP环境是比较简单的,只需按照命令行执行即可,记录操作以备不时之需. 一,首先更新Ubuntu里面所有的软件 sudo apt-get update 二.之后安装Apa ...

  3. 直接使用汇编编写 .NET Standard 库

    前言 Common Language Runtime(CLR)是一个很强大的运行时,它接收 Common Intermediate Language(CIL) 的输入并最终产生机器代码并执行.CIL ...

  4. codewars--js--Human Readable Time—Math对象,parseInt()

    问题描述: Write a function, which takes a non-negative integer (seconds) as input and returns the time i ...

  5. 封装dropdown模块(使用到之前写好的动画组件,封装下拉菜单)

    用 showhide 改写dropdown 模块: 1.首先在 css中新增动画相关样式 /*showhide组件的样式*/ .fadeOut{ opacity:; visibility: hidde ...

  6. OpenLayers要素拖拽

    //拖拽要素 function dragFeature (_map,_dragEndCallback) { let selFeature = null; _map.on("pointerdr ...

  7. update mysql row (You can't specify target table 'x' for update in FROM clause)

    sql语句(update/delete都会出现此问题) update x set available_material_id = null where id not in (select id fro ...

  8. centos7下查看mysql配置文件适用顺序

    mysql --help|grep 'my.cnf' [root@izm5e2q95pbpe1hh0kkwoiz ~]# mysql --help|grep 'my.cnf' order of pre ...

  9. #《Essential C++》读书笔记# 第三章 泛型编程风格

    基础知识 array与vector是连续存储空间,可以用指针的算术运算实现对容器的访问.list也是一个容器,不同的是,list的元素以一组指针相互链接(linked):前向(forward)指针指向 ...

  10. Centos7.6 Mysql数据库自动备份配置

    1.查看磁盘空间情况 执行 df -h 选择剩余空间最大的目录 (以/目录为例) 2.创建备份目录: cd / mkdir backup cd backup 3.创建备份Shell脚本: vim mo ...