master method(主定理)
master method(主定理)
假设有递推关系式 T(n)=aT(nb)+f(n)T(n) = aT(\frac{n}{b}) + f(n)T(n)=aT(bn)+f(n) ,其中 nnn 为问题的规模,aaa 为递推的子问题数量,nb\frac{n}{b}bn 为每个子问题的规模(假设每个子问题的基本规模基本一样),f(n)f(n)f(n) 为递推以外进行的计算工作。
a≥1,b>1a \geq 1, b > 1a≥1,b>1 为常数,f(n)f(n)f(n) 为函数,T(n)T(n)T(n) 为非负整数。则有以下结果(分类讨论):
(1)若 f(n)=O(nlogba−ε)f(n) = O(n^{log_ba - \varepsilon})f(n)=O(nlogba−ε) ,ε>0\varepsilon > 0ε>0 ,那么 T(n)=Θ(nlogba)T(n) = \Theta(n^{log_ba})T(n)=Θ(nlogba)
(2)若 f(n)=Θ(nlogba)f(n) = \Theta(n^{log_ba})f(n)=Θ(nlogba) ,那么 T(n)=Θ(nlogbalogn)T(n) = \Theta(n^{log_ba}logn)T(n)=Θ(nlogbalogn)
(3)若 f(n)=Ω(nlogba+ε)f(n) = \Omega(n^{log_ba + \varepsilon})f(n)=Ω(nlogba+ε) ,ε>0\varepsilon > 0ε>0 ,且对于某个常数 c<1c < 1c<1 和所有充分大的 nnn 有 af(nb)≤cf(n)af(\frac{n}{b}) \leq cf(n)af(bn)≤cf(n) ,那么 T(n)=Θ(f(n))T(n) = \Theta(f(n))T(n)=Θ(f(n))
注:摘自百度百科,主定理。
主定理翻译
简单翻译下:
对于递推关系式 T(n)=aT(nb)+f(n)T(n) = aT(\frac{n}{b}) + f(n)T(n)=aT(bn)+f(n) 可以分为三种情况讨论 T(n)T(n)T(n) 等于多少。
第一种情况
如果 f(n)=O(nlogba−ε)f(n) = O(n^{log_ba - \varepsilon})f(n)=O(nlogba−ε) ,ε>0\varepsilon > 0ε>0 ,那么时间复杂度就是 T(n)=O(nlogba)T(n) = O(n^{log_ba})T(n)=O(nlogba)
可能会觉得明明就是 T(n)=Θ(nlogba)T(n) = \Theta(n^{log_ba})T(n)=Θ(nlogba) ,怎么变成 T(n)=O(nlogba)T(n) = O(n^{log_ba})T(n)=O(nlogba)
这个应该是个数学问题,可以简单理解成一切 Θ(f(n))\Theta(f(n))Θ(f(n)) 都是 O(f(n))O(f(n))O(f(n)) ,但是不可以反过来。
这个暂时没想到现成的代码例子(想到了就补上)。就举个抽象的例子吧。
比如 T(n)=4×T(n2)+nT(n) = 4 \times T(\frac{n}{2}) + nT(n)=4×T(2n)+n
我们通过递推式可以得到 a=4,b=2,f(n)=na = 4, b = 2, f(n) = na=4,b=2,f(n)=n
我们先计算下 nlogban^{log_ba}nlogba 显然 nlogba=n2n^{log_ba} = n^2nlogba=n2
f(n)=n=O(n2−1)f(n) = n = O(n^{2 - 1})f(n)=n=O(n2−1) 因此我们得到 ε=1>0\varepsilon = 1 > 0ε=1>0 符合第一种情况。
故 T(n)=O(n2)T(n) = O(n^2)T(n)=O(n2) 即时间复杂度式 O(n2)O(n^2)O(n2)
注意:这里的 T(n)T(n)T(n) 是递归函数的执行时间。
第二种情况
如果 f(n)=Θ(nlogba)f(n) = \Theta(n^{log_ba})f(n)=Θ(nlogba) ,那么 T(n)=Θ(nlogbalogn)T(n) = \Theta(n^{log_ba}logn)T(n)=Θ(nlogbalogn)
第一种情况已经讲的很详细了,现在直接举具体的例子-我们熟知的快速排序
主要代码部分:
void quick_sort(int arr[], int low, int high) {if (low >= high) {return;}int mid = split(arr, low, high);quick_sort(arr, low, mid - 1);quick_sort(arr, mid + 1, high);
}
我们设 T(n)T(n)T(n) 为 quick_sort 的执行时间。
则 T(n)=n+T(n2)+T(n2)=2T(n2)+nT(n) = n + T(\frac{n}{2}) + T(\frac{n}{2}) = 2T(\frac{n}{2}) + nT(n)=n+T(2n)+T(2n)=2T(2n)+n
我们先计算下 nlogban^{log_ba}nlogba 显然 nlogba=n=f(n)n^{log_ba} = n = f(n)nlogba=n=f(n) 满足第二种情况。
那么 T(n)=(nlogn)T(n) = (nlogn)T(n)=(nlogn) 即时间复杂度 O(nlogn)O(nlogn)O(nlogn)
第三种情况
如果 f(n)=Ω(nlogba+ε)f(n) = \Omega(n^{log_ba + \varepsilon})f(n)=Ω(nlogba+ε) ,ε>0\varepsilon > 0ε>0 ,且对于某个常数 c<1c < 1c<1 和所有充分大的 nnn 有 af(nb)≤cf(n)af(\frac{n}{b}) \leq cf(n)af(bn)≤cf(n) ,那么 T(n)=Θ(f(n))T(n) = \Theta(f(n))T(n)=Θ(f(n))
举个抽象例子吧 T(n)=2T(n2)+n2T(n) = 2T(\frac{n}{2}) + n^2T(n)=2T(2n)+n2
我们先计算下 nlogban^{log_ba}nlogba 显然 nlogba=nn^{log_ba} = nnlogba=n
f(n)=n2=Ω(n1+1)f(n) = n^2 = \Omega(n^{1 + 1})f(n)=n2=Ω(n1+1) 因此我们得到 ε=1>0\varepsilon = 1 > 0ε=1>0 且对于某个常数 c<1c < 1c<1 和所有充分大的 nnn 有 af(nb)≤cf(n)af(\frac{n}{b}) \leq cf(n)af(bn)≤cf(n)
对于后面这个 且对于某个常数 c<1c < 1c<1 和所有充分大的 nnn 有 af(nb)≤cf(n)af(\frac{n}{b}) \leq cf(n)af(bn)≤cf(n) 只要我们的 c∈(12,1)c \in (\frac{1}{2}, 1)c∈(21,1) 就可以满足 af(nb)≤cf(n)af(\frac{n}{b}) \leq cf(n)af(bn)≤cf(n)
所以 T(n)=Θ(f(n))T(n) = \Theta(f(n))T(n)=Θ(f(n)) 即是时间复杂度为 O(n2)O(n^2)O(n2)
总结
主定理被描述为解决这种递推的“天下无敌法”(master method),对于我们分析递归的时间复杂度是超级有帮助的。
也并不是所有的递归都可以用主题定理推出来。(比如说汉诺塔问题,斐波那契数列等,他们的递推式显然并不满足主定理的递推式,根据严蔚民版的数据结构上的方法,我们直接暴力递推就好了)
此外,还有一种分析递归时间复杂度的方法叫做 recusion tree 递归树分析法,以后有时间再介绍吧。
master method(主定理)相关推荐
- Master—Theorem 主定理的证明和使用
引言? 在分析算法的时候,我们经常需要分析递归算法的时间复杂度.Master--Theorem 正是用于快速得出递归算法时间复杂度的方法. Master-Theorem 假设某个递归算法的时间复杂度递 ...
- 主定理(Master Theorem) 及其应用
主定理"Master Theorem" 一.主定理(Master Theorem) 二.应用举例 在分析算法的时候,我们经常需要分析递归算法的时间复杂度. 一.主定理(Master ...
- 递归算法复杂度与主定理的推导
一.基本概念 分治法的基本思想 分治法就是把一个大的问题分解成为若干个小的问题,求出小问题的解后合并即为大问题的解 分治法能够解决的问题的一般特征 该问题可以分解为若干规模规模较小的相同问题: 该问题 ...
- 主定理(Master theorem)与Akra–Bazzi定理
一.主定理(Master theorem) 主定理是算法分析中的一个重要结论,它主要用于求解基于分治思想设计的递归算法的渐进复杂度.该结论最初由Jon Bentley, Dorothea Haken, ...
- 主项定理Master Method 计算时间复杂度
在面试题目中有一部分是让大家求时间复杂度的问题,例如给出我们: T(n) = a * T(n/b) + f(n) ( a ³ 1,b > 1,f(n)一般是个简单函数)这样的递归方 ...
- 主定理(master theorem)学习小记
前言 这是分析复杂度的一个玩意儿,东西不多,原本只要死记一下就好了,但是考虑到我不太好的记忆力,所以还是解析一遍比较好 正文 主定理是用来分析T(n)=aT(nb)+f(n)T(n)=aT(\frac ...
- 主定理(Master Theorem)与时间复杂度
1. 问题 Karatsuba 大整数的快速乘积算法的运行时间(时间复杂度的递推关系式)为 T(n)=O(n)+4⋅T(n/2),求其最终的时间复杂度. 2. 主定理的内容 3. 分析 所以根据主定理 ...
- 主定理(Master Theorem)推导和理解(1)
主定理:设为常数,f(n)为函数,T(n)为非负数,且 则有以下结果: 证明 不妨设,经过迭代,能够得到: 证毕.
- 离散数学及其应用学习笔记——主定理(Master Theorem)的证明
先贴出两个初中数学公式 使用换根公式和对数倒数性质可以得出这样的结论: alogbn=nlogba a^{log_bn}=n^{log_ba} 等比数列求和公式: Sn=anq−a1q−1 S_n=\ ...
最新文章
- Java基础概念性的知识总结
- MySQL增量订阅消费组件Canal POC
- android百度地图更换定位图标,android百度地图定位,改变MyLocationOverlay默认图标(原始为蓝色点)(两种方法)...
- layui监听当前页_事件监听 · layui使用手册 · 看云
- java根据ip查计算机名_Java如何从IP地址查找主机名?
- MySQL数据库-笔记06【SQL的4种连接查询、事务】
- PHPCMS V9 采集实例
- vs entityframwork Validation failed for one or more entities
- (四)训练运行Deep CycleGAN以进行移动风格迁移
- 从大到小输出a、b、c(选择结构)
- 主流H.264编码器对比测试 (MSU出品)
- python中pickle模块_python中的pickle模块
- CodeForces615A-Bulbs-模拟
- teamcity mysql 配置_TeamCity
- 使用Freeimage库时报错的解决方法
- AXD 查看register笔记
- python进行图像的风格转换
- 【路科V0】systemVerilog基础3——字符串类型
- 所有用户登陆后都在桌面上显示计算机图标,如何在Win10桌面上显示计算机.控制面板.网络.用户的文件图标?...
- Linux网络配置和常用命令