主方法

在算法分析中,我们主要使用代入法,递归树法,和主方法来分析递归式
而主方法为如下形式的递归式提供了一套“菜谱”式解法:

T(n)=aT(nb)+f(n)T(n)=aT(\frac nb)+f(n)T(n)=aT(bn​)+f(n)


几个主要形式:

1.

若对某个常数 ε>0\varepsilon \gt 0ε>0 有

f(n)=ο(nlog⁡ba−ε)f(n) = \omicron (n^{\log_b{a-\varepsilon} })f(n)=ο(nlogb​a−ε)

那么
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)=θ(nlogbalg⁡n)T(n)=\theta(n^{log_ba}\lg n)T(n)=θ(nlogb​algn)


3.

若对某个常数 ε>0\varepsilon>0ε>0有
f(n)=Ω(nlog⁡ba+ε)f(n) = \Omega(n^{\log_b{a+\varepsilon} })f(n)=Ω(nlogb​a+ε)

且对于某个常数c<1和所有足够大的n有
af(nb)≤cf(n)af(\frac nb)\le cf(n)af(bn​)≤cf(n)


T(n)=θ(f(n))T(n) = \theta(f(n))T(n)=θ(f(n))


将函数f(n)f(n)f(n)与函数nlogban^{log_b{a}}nlogb​a进行比较。直觉上,两个函数较大者决定了递归式的解。

证明:

这个要死记硬背那可太难了,还是证明一下怎么来的比较好

T(N)=aT(Nb)+θ(Nk)T(N)=aT(\frac Nb) + \theta (N^k)T(N)=aT(bN​)+θ(Nk)

a表示一个问题分解成子问题的数目,N/b表示每个子问题的规模a表示一个问题分解成子问题的数目,N/b表示每个子问题的规模a表示一个问题分解成子问题的数目,N/b表示每个子问题的规模

不妨设N=bm,即大问题是子问题规模的m次幂,且T(1)=1不妨设N=b^m,即大问题是子问题规模的m次幂,且T(1)=1不妨设N=bm,即大问题是子问题规模的m次幂,且T(1)=1

于是原式有:T(bm)=aT(bm−1)+(bk)m于是原式有:T(b^m)=aT(b^{m-1})+(b^k)^m于是原式有:T(bm)=aT(bm−1)+(bk)m

左右同除am:T(bm)am=T(bm−1)am−1+(bka)m左右同除a^m:\frac {T(b^m)}{a^m}=\frac {T(b^{m-1})}{a^{m-1}}+(\frac {b^k}a)^m左右同除am:amT(bm)​=am−1T(bm−1)​+(abk​)m

于是我们的到了一个等差数列,初项设m=0,T(1)/1=1于是我们的到了一个等差数列,初项设m=0,T(1)/1=1于是我们的到了一个等差数列,初项设m=0,T(1)/1=1

求和之后得到:T(bm)am=∑i=0m(bka)i求和之后得到:\frac {T(b^m)}{a^m}=\displaystyle\sum_{i=0}^m(\frac {b^k}a)^i求和之后得到:amT(bm)​=i=0∑m​(abk​)i
即为:T(N)=am∑i=0m(bka)i即为:T(N)=a^m\displaystyle\sum_{i=0}^m(\frac {b^k}a)^i即为:T(N)=ami=0∑m​(abk​)i

1.当a>bk即k=logba−ε即f(n)=θ(Nk)=ο(nlog⁡ba−ε)1.当a>b^k \hspace3ex即k=log_ba- \varepsilon \hspace3ex即f(n) = \theta(N^k)=\omicron (n^{\log_b{a-\varepsilon} })1.当a>bk即k=logb​a−ε即f(n)=θ(Nk)=ο(nlogb​a−ε)
此时级数的和为一个小于无穷大的常数,于是T(N)=O(am)=O(alogbN)=O(Nlogba)此时级数的和为一个小于无穷大的常数,于是T(N)=\Omicron(a^m)=\Omicron(a^{log_bN})=\Omicron(N^{log_ba})此时级数的和为一个小于无穷大的常数,于是T(N)=O(am)=O(alogb​N)=O(Nlogb​a)

2.当a=bk即k=logba即f(n)=θ(Nk)=θ(Nlog⁡ba)2.当a=b^k \hspace3ex即k=log_ba \hspace3ex即f(n)=\theta(N^k)=\theta(N^{\log_ba })2.当a=bk即k=logb​a即f(n)=θ(Nk)=θ(Nlogb​a)
此时级数的和为m,于是T(N)=(m+1)am=O(Nlog⁡balogbN)此时级数的和为m,于是T(N)=(m+1)a^m=\Omicron(N^{\log_ba }log_bN)此时级数的和为m,于是T(N)=(m+1)am=O(Nlogb​alogb​N)

3.当a<bk即k=logba+ε即f(n)=θ(Nk)=Ω(nlog⁡ba−ε)3.当a<b^k \hspace3ex即k=log_ba+\varepsilon\hspace3ex即f(n)=\theta(N^k)=\Omega(n^{\log_b{a-\varepsilon} })3.当a<bk即k=logb​a+ε即f(n)=θ(Nk)=Ω(nlogb​a−ε)
此时级数的和为(bk/a)m−1bk/a−1,于是T(N)=am(bk/a)m−1bk/a−1=O(Nk)此时级数的和为\frac{(b^k/a)^m-1}{b^k/a-1},于是T(N)=a^m{\frac{(b^k/a)^m-1}{b^k/a-1}}=\Omicron(N^k)此时级数的和为bk/a−1(bk/a)m−1​,于是T(N)=ambk/a−1(bk/a)m−1​=O(Nk)

例如:矩阵相乘的Strassen算法:
T(N)=7T(N/2)+O(N2)T(N)=7T(N/2)+O(N^2)T(N)=7T(N/2)+O(N2)
有T(N)=O(Nlog27)=O(N2.81)有T(N)=O(N^{log_27})=O(N^{2.81})有T(N)=O(Nlog2​7)=O(N2.81)
很方便很炫酷有没有!!!

算法分析之-主方法分析递归式相关推荐

  1. 【算法导论-主定理】用主方法求解递归式 学练结合版

    问题:若某算法的计算时间表示为递推关系式:T(N)=2T(N/2)+NlogN 且 T(1)=1 则该算法的时间复杂度为( ). O(Nsqrt(N)) O(NlogN) O(N(logN)^2) O ...

  2. 用递归树方法求解递归式

    用递归树方法求解递归式 [备注:需要修改] 一个递归算法的递归式:T(n)=3T(n/4)+cn2T\left(n\right)=3T\left(n/4\right)+cn^2T(n)=3T(n/4) ...

  3. 第四章 分治策略 4.4 用递归树方法求解递归式

    4.4 用递归数方法求解递归式 一. 1.   在递归树中,每个结点表示一个单一子问题的代价,子问题对应某次递归函数调用.我们将树中每层中的代价求和,得到每层代价,然后将所有层的代价求和,得到所有层次 ...

  4. 算法导论 — 4.4 用递归树方法求解递归式

    笔记 在应用代入法求解递归式时,需要事先做出一个好的猜测.然而,有时候做出好的猜测是很困难的,此时可以考虑采用递归树方法.在递归树中,每个结点表示一个单一子问题的代价.创建递归树之后,对树的每层的各子 ...

  5. 主定理(递归式分析)

    上图来自<算法导论> 其意思为: 令a≥1,b>1都是常数,f(n)是一个函数 T(n)是定义在非负整数上的递推式: 1.对某个常数,有,则 2.若,则 3.对某个常数,有 且对某个 ...

  6. 主定理(主方法)求解递归式

    1.主方法使用条件 用主方法求解递归式有条件,必须要求递归式为以下形式: 其中a>=1,b>1,f(n)渐进趋正,意为对足够大的n,f(n)是正的,即n>= n 0 n_0 n0​时 ...

  7. 主定理与主方法:一类递归式的紧确界分析

    主定理 对递归式,将与比较,两个函数较大者决定了递归式的解 若更大,则解为 若对某个常数,有 若更大,则解为 若对某个常数,有 若两者相当,则乘上一个对数因子 若 主方法 (对着主定理对号入座) 注意 ...

  8. 算法笔记-递归算法、递归排序、递归的时间复杂度、master公式(也叫主方法)

    1. 递归排序题 通过递归算法来获取一个数组中的最大值 2. 算法思路 采用递归的思路来进行解题,那么肯定是需要自己调用自己的,这也就是递归,于是考虑怎么自己调用自己呢?我们可以采用二分法来制造递归的 ...

  9. 递归方程的求解(代入、递归树和主方法)

    递归方程 递归方程之前提到过,就是部分算法在求解的过程中使用了将一个问题划分成几个等价的小问题,在这个过程中,我们就可以列出一个等式. (如归并排序中,将一个大数组拆分成两个小数组分别计算,然后用O( ...

最新文章

  1. Codeforces数学1600day3[数学CodeForces - 1213D2, CodeForces - 1165E 数论,CodeForces - 1165D 因子分解]
  2. plotly可视化绘制共享坐标轴图
  3. 【深度学习】解析深度神经网络背后的数学原理
  4. Fitnesse测试系列--如何做成模块Module供调用
  5. c++调用python返回字典
  6. JavaScript一些常用 API整理汇总
  7. [sol]250OJ 1~10
  8. 值得永久收藏的 C# 设计模式套路(二)
  9. Android笔记-Xposed的使用(Hook登录函数获取用户名密码)
  10. Linux把日志文件转换成xml,[转载]将 HTML 文件转换成 XML
  11. 数组和指针:超过一半的数字;水王发帖
  12. 博弈论-共有知识与共同知识
  13. android之添加raw文件
  14. CDH,HDP,Apache Hadoop之间的关系
  15. 网络打印机 显示服务器脱机,网络打印机老是脱机怎么回事 网络打印机显示脱机的处理办法...
  16. 10102 循环输入字符串
  17. 【Love2d从青铜到王者】第九篇:Love2d之库(library)
  18. 带你玩转 3D 检测和分割(一):MMDetection3D 整体框架介绍
  19. davinci平台Uboot移植
  20. C++设计模式-中介者模式详解

热门文章

  1. ASP.NET CORE 入门教程(附源码)
  2. 本地 php nginx压测试
  3. Java 多线程使用
  4. (树)判断二叉树是否为BST
  5. 关于微信小程序的尺寸关系
  6. 前端学PHP之面向对象系列第四篇——关键字
  7. 第二冲刺站立会议01
  8. 团队开发--手机小游戏 需求分析
  9. JBoss4.2.3部署SSH2
  10. 神经网络与机器学习 笔记—核方法和径向基函数网络(上)