对主定理(Master Theorem)的理解
前言
虽说在学OI的时候学到了非常多的有递归结构的算法或方法,也很清楚他们的复杂度,但更多时候只是能够大概脑补这些方法为什么是这个复杂度,而从未从定理的角度去严格证明他们。因此借着这个机会把主定理整个梳理一遍。
介绍
主定理(Master Theorem)提供了用于分析一类有递归结构算法时间复杂度的方法。这种递归算法通常有这样的结构:
def solve(problem):
solve_without_recursion()
for subProblem in problem:
solve(subProblem)
我们可以用一种表示方式来概括这些结构的算法:对于一个规模为\(n\)的问题,我们把它分为\(a\)个子问题,每个子问题规模为\(\frac nb\)。那么这种方法的复杂度\(T(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}\)个叶子节点。因此这种方法的复杂度也可以表示为:
\]
从中我们可以看出,整个方法的复杂度取决于\(f(n)\)的复杂度。主定理对\(f(n)\)分了三种情况:
- \(\exist \varepsilon>0\ s.t.\ f(n)=O(n^{\log_ba-\varepsilon})\)。此时\(T(n)=\Theta(n^{\log_ba})\)。
- \(f(n)=\Theta(n^{\log_ba})\)。此时\(T(n)=\Theta(n^{\log_ba}\lg n)\)。
- \(\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})\),得:
\]
之后就是对后面式子的化简:
\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})\)。所以有:
\]
Case 2
同Case 1。令\(g(n)=\sum_{i=0}^{\log_bn-1}a^if(\frac{n}{b^i})\)得:
\]
继续化简:
\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\)。所以有:
\]
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)\)。我们对这个条件做一下处理:
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}
\]
由此我们可以很轻易的向下化简:
\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))\)。
所以有:
\]
证毕。
应用
二叉树建树
\]
此时\(\log_ba<1\),满足Case 1。
BFPRT(Median of Medians)
\]
此时\(\log_ba>1\),即划分之后总规模减小(\(1/5+7/10<1\)),满足Case 2。
归并排序
\]
此时\(\log_ba=1\),满足Case 3。
对主定理(Master Theorem)的理解的更多相关文章
- 算法设计与分析 - 主定理Master theorem (分治法递推时间复杂度)
英文原版不上了 直接中文 定义 假设有递推关系式T(n)=aT(n/b)+f(n) 其中n为问题规模 a为递推的子问题数量 n/b为每个子问题的规模(假设每个子问题的规模基本一样) f(n)为递推以外 ...
- 主定理(Master Theorem)与时间复杂度
1. 问题 Karatsuba 大整数的快速乘积算法的运行时间(时间复杂度的递推关系式)为 T(n)=O(n)+4⋅T(n/2),求其最终的时间复杂度. 2. 主定理的内容 3. 分析 所以根据主定理 ...
- 重新粗推了一下Master Theorem
主定理一般形式是T(n) = a T(n / b) + f(n), a >= 1, b > 1.递归项可以理解为一个高度为 logbn 的 a 叉树, 这样 total operation ...
- 答:SQLServer DBA 三十问之二:系统DB有哪些,都有什么作用,需不需要做备份,为什么;损坏了如何做还原(主要是master库)
2. 系统DB有哪些,都有什么作用,需不需要做备份,为什么:损坏了如何做还原(主要是master库): master:它包含一个系统表集合,是整个实例的中央存储库,维护登录账户,其他数据库,文件分布, ...
- Master Theorem
Master theorem provides a solution in asymptotic terms to solve time complexity problem of most divi ...
- 确界原理 supremum and infimum principle 戴德金定理 Dedekind theorem
确界原理 supremum and infimum principle 戴德金定理 Dedekind theorem http://www.math.ubc.ca/~cass/courses/m ...
- [BZOJ4007][JLOI2015]战争调度(DP+主定理)
第一眼DP,发现不可做,第二眼就只能$O(2^{1024})$暴搜了. 重新审视一下这个DP,f[x][i]表示在x的祖先已经全部染色之后,x的子树中共有i个参战平民的最大贡献. 设k为总结点数,对于 ...
- 旋度定理(Curl Theorem)和散度定理(Divergence theorem)
原文链接 首先说说格林公式(Green's theorem).对于一段封闭曲线,若其围城的区域D为单连通区域(内部任意曲线围城的区域都属于院区域),则有如下公式: 其中其中L为D的边界,取正方向.如果 ...
- O、Θ、Ω&主定理
1.这些是时间复杂度的.(e.g. O(n).Θ(n).Ω(n)) 主要为主定理(坏东西) 2.本质 O <= Θ = Ω >= 3.(你可以把他们都试一遍)主要用处(目前,2020-09 ...
随机推荐
- CodeForces 429B Working out DP
E - Working out Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Su ...
- JS推箱子游戏
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...
- ModbusTCP协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析Modbus所含功能码
现在网上有很多类似的文章.其实这一篇也借鉴了很多其他博主的文章. 写这篇文章的重点是在于解析功能和报文.对Modbus这个协议并不会做很多介绍. 好了,我们开始吧. 常用的功能码其实也没多少.我也就按 ...
- 如何用apply实现一个bind?
面试题:如何用apply实现一个bind? Function.prototype._bind = function(target) { // 保留调用_bind方法的对象 let _this = th ...
- .Net框架的模块代码生成器--其三(dotnet tool指令的参数)
别人已经写好了一个这种处理指令参数的库,我们这里是使用别人的库来实现规范的指令系统 继续上一篇的gfile或者新建一个.Net Core控制台程序也可以 1.安装nuget包,程序包管理器控制台运行 ...
- 使用Teigha.net读取CAD的常用功能模块
Teigha中实体旋转 代码: using (var trans = database.TransactionManager.StartTransaction()) { Entity ent = tr ...
- mysql基础(附具体操作代码)
# 注释内容 -- 注释内容 -- 创建数据库 king CREATE DATABASE king; -- 查看当前服务器下有哪些数据库 SHOW DATABASES; SHOW SCHEMAS; - ...
- [菜b]Isaunoya 的一些学习笔记…[保持咕咕咕]
fread/fwrite标记永久化 分块 树链剖分 莫比乌斯反演 斜率优化/单调队列 kruskal重构树 回滚莫队 可持久化线段树/trie树 Link-Cut-Tree dsu on tree F ...
- Badusb 简易制作
Badusb easy_make 0x00 basic knowledge and equip arduino IDE download address: https://www.arduino.cc ...
- GHM论文笔记(CVPR2019)
目录 作者要解决的问题 Focal loss(CVPR2017) Focal loss的解决方案 Focal loss的不足 设计思路 梯度与样本的关系 梯度分布计算方法:将0-1的梯度切bin,计算 ...