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(nlogb​a−ε) ,ε>0\varepsilon > 0ε>0 ,那么 T(n)=Θ(nlogba)T(n) = \Theta(n^{log_ba})T(n)=Θ(nlogb​a)

(2)若 f(n)=Θ(nlogba)f(n) = \Theta(n^{log_ba})f(n)=Θ(nlogb​a) ,那么 T(n)=Θ(nlogbalogn)T(n) = \Theta(n^{log_ba}logn)T(n)=Θ(nlogb​alogn)

(3)若 f(n)=Ω(nlogba+ε)f(n) = \Omega(n^{log_ba + \varepsilon})f(n)=Ω(nlogb​a+ε) ,ε>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(nlogb​a−ε)​ ,ε>0\varepsilon > 0ε>0​ ,那么时间复杂度就是 T(n)=O(nlogba)T(n) = O(n^{log_ba})T(n)=O(nlogb​a)​

可能会觉得明明就是 T(n)=Θ(nlogba)T(n) = \Theta(n^{log_ba})T(n)=Θ(nlogb​a) ,怎么变成 T(n)=O(nlogba)T(n) = O(n^{log_ba})T(n)=O(nlogb​a)

这个应该是个数学问题,可以简单理解成一切 Θ(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}nlogb​a 显然 nlogba=n2n^{log_ba} = n^2nlogb​a=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)=Θ(nlogb​a) ,那么 T(n)=Θ(nlogbalogn)T(n) = \Theta(n^{log_ba}logn)T(n)=Θ(nlogb​alogn)

第一种情况已经讲的很详细了,现在直接举具体的例子-我们熟知的快速排序

主要代码部分:

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}nlogb​a​​ 显然 nlogba=n=f(n)n^{log_ba} = n = f(n)nlogb​a=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)=Ω(nlogb​a+ε) ,ε>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}nlogb​a​ 显然 nlogba=nn^{log_ba} = nnlogb​a=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(主定理)相关推荐

  1. Master—Theorem 主定理的证明和使用

    引言? 在分析算法的时候,我们经常需要分析递归算法的时间复杂度.Master--Theorem 正是用于快速得出递归算法时间复杂度的方法. Master-Theorem 假设某个递归算法的时间复杂度递 ...

  2. 主定理(Master Theorem) 及其应用

    主定理"Master Theorem" 一.主定理(Master Theorem) 二.应用举例 在分析算法的时候,我们经常需要分析递归算法的时间复杂度. 一.主定理(Master ...

  3. 递归算法复杂度与主定理的推导

    一.基本概念 分治法的基本思想 分治法就是把一个大的问题分解成为若干个小的问题,求出小问题的解后合并即为大问题的解 分治法能够解决的问题的一般特征 该问题可以分解为若干规模规模较小的相同问题: 该问题 ...

  4. 主定理(Master theorem)与Akra–Bazzi定理

    一.主定理(Master theorem) 主定理是算法分析中的一个重要结论,它主要用于求解基于分治思想设计的递归算法的渐进复杂度.该结论最初由Jon Bentley, Dorothea Haken, ...

  5. 主项定理Master Method 计算时间复杂度

    在面试题目中有一部分是让大家求时间复杂度的问题,例如给出我们:  T(n) = a * T(n/b) + f(n)   ( a  ³  1,b  >  1,f(n)一般是个简单函数)这样的递归方 ...

  6. 主定理(master theorem)学习小记

    前言 这是分析复杂度的一个玩意儿,东西不多,原本只要死记一下就好了,但是考虑到我不太好的记忆力,所以还是解析一遍比较好 正文 主定理是用来分析T(n)=aT(nb)+f(n)T(n)=aT(\frac ...

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

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

  8. 主定理(Master Theorem)推导和理解(1)

    主定理:设为常数,f(n)为函数,T(n)为非负数,且 则有以下结果: 证明 不妨设,经过迭代,能够得到: 证毕.

  9. 离散数学及其应用学习笔记——主定理(Master Theorem)的证明

    先贴出两个初中数学公式 使用换根公式和对数倒数性质可以得出这样的结论: alogbn=nlogba a^{log_bn}=n^{log_ba} 等比数列求和公式: Sn=anq−a1q−1 S_n=\ ...

最新文章

  1. Java基础概念性的知识总结
  2. MySQL增量订阅消费组件Canal POC
  3. android百度地图更换定位图标,android百度地图定位,改变MyLocationOverlay默认图标(原始为蓝色点)(两种方法)...
  4. layui监听当前页_事件监听 · layui使用手册 · 看云
  5. java根据ip查计算机名_Java如何从IP地址查找主机名?
  6. MySQL数据库-笔记06【SQL的4种连接查询、事务】
  7. PHPCMS V9 采集实例
  8. vs entityframwork Validation failed for one or more entities
  9. (四)训练运行Deep CycleGAN以进行移动风格迁移
  10. 从大到小输出a、b、c(选择结构)
  11. 主流H.264编码器对比测试 (MSU出品)
  12. python中pickle模块_python中的pickle模块
  13. CodeForces615A-Bulbs-模拟
  14. teamcity mysql 配置_TeamCity
  15. 使用Freeimage库时报错的解决方法
  16. AXD 查看register笔记
  17. python进行图像的风格转换
  18. 【路科V0】systemVerilog基础3——字符串类型
  19. 所有用户登陆后都在桌面上显示计算机图标,如何在Win10桌面上显示计算机.控制面板.网络.用户的文件图标?...
  20. Linux网络配置和常用命令

热门文章

  1. 【数据结构 图】数据结构实验--图及其应用
  2. socket函数返回值分析
  3. Day 1 | 实习第一天 飞思卡尔S12VR
  4. python getattr函数_Python getattr()方法
  5. 第九章、文件与文件系统的压缩与打包
  6. 我的世界服务器伤害增加bug,我的世界服务器遇到重大BUG的解决方法分享
  7. 两类数学归纳法及斐波那契通项的证明
  8. (转)一张图看懂H5测试
  9. monit 内存 监控_如何使用Monit部署服务器监控系统
  10. yoloV5改进-针对小目标的NWD