当前位置: 首页 > news >正文

递归时间复杂度分析方法:Master 定理

编写算法时,可能因为对自己代码的复杂度的不清晰而导致错失良机,对于普通的递推或者说循环的代码,仅用简单的调和级数或者等差数列等比数列即可分析,但是对于递归的代码,简单的递归树法并不方便,理解并记下Master定理,可以让事情变得轻松。

写此文以作笔记,如有错误,请联系博主。

Master 定理基本形式

对于一个递归式 T ( n ) = a T ( n b ) + f ( n ) T(n) = aT(\frac{n}{b}) + f(n) T(n)=aT(bn)+f(n),其中:

  • a ≥ 1 a \geq 1 a1 b > 1 b > 1 b>1 是常数;
  • f ( n ) f(n) f(n) 是一个给定的函数,
    Master 定理帮助我们确定 T ( n ) T(n) T(n) 的渐进界。

有三种情况:

  1. 如果 f ( n ) = O ( n c ) f(n) = O(n^c) f(n)=O(nc),其中 c < log ⁡ b a c < \log_b{a} c<logba 那么 T ( n ) = Θ ( n log ⁡ b a ) T(n) = \Theta(n^{\log_b{a}}) T(n)=Θ(nlogba)
  2. 如果 f ( n ) = Θ ( n c ) f(n) = \Theta(n^c) f(n)=Θ(nc),其中 c = log ⁡ b a c = \log_b{a} c=logba 那么 T ( n ) = Θ ( n c log ⁡ n ) T(n) = \Theta(n^c\log{n}) T(n)=Θ(nclogn)
  3. 如果 f ( n ) = Ω ( n c ) f(n) = \Omega(n^c) f(n)=Ω(nc),其中 c > log ⁡ b a c > \log_b{a} c>logba,且满足一定的平滑条件(即 a f ( n / b ) ≤ k f ( n ) af(n/b) \leq kf(n) af(n/b)kf(n) 对于某个常数 k < 1 k < 1 k<1 和充分大的 n n n), 那么 T ( n ) = Θ ( f ( n ) ) T(n) = \Theta(f(n)) T(n)=Θ(f(n))
特定的例子

考虑 T ( n ) = 2 T ( n 2 ) + O ( n log ⁡ n ) T(n) = 2T(\frac{n}{2}) + O(n\log{n}) T(n)=2T(2n)+O(nlogn),这里 a = 2 a = 2 a=2, b = 2 b = 2 b=2, 和 f ( n ) = n log ⁡ n f(n) = n\log{n} f(n)=nlogn。显然, f ( n ) f(n) f(n) 不符合 Master 定理的标准形式中的 f ( n ) = O ( n c ) f(n) = O(n^c) f(n)=O(nc),因为增长速度比任何 n c n^c nc 形式要快。因此,直接应用标准 Master 定理的三种情况并无法获得解答。

在这种特殊情况下, T ( n ) = 2 T ( n 2 ) + n log ⁡ n T(n) = 2T(\frac{n}{2}) + n\log{n} T(n)=2T(2n)+nlogn 的时间复杂度实际上是 O ( n ( log ⁡ n ) 2 ) O(n(\log{n})^2) O(n(logn)2)。如有兴趣请自行查找证明过程。

http://www.lryc.cn/news/339210.html

相关文章:

  • 实例名不规范导致mds创建失败
  • OpenGL中的纹理过滤GL_NEAREST和GL_LINEAR
  • vue 性能优化
  • 互联网大厂ssp面经(操作系统:part1)
  • Android Activity 启动涉及几个进程
  • 说说你对链表的理解?常见的操作有哪些?
  • 每天五分钟深度学习:逻辑回归算法的损失函数和代价函数是什么?
  • llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署
  • C语言游戏实战(11):贪吃蛇大作战(多人对战)
  • 腾讯测试岗位的面试经历与经验分享【一面、二面与三面】
  • 手机移动端网卡信息获取原理分析
  • 无人新零售引领的创新浪潮
  • SD-WAN提升企业网络体验
  • Docker搭建Let‘s Encrypt
  • 单链表讲解
  • DFS算法系列 回溯
  • Linux C应用编程:MQTT物联网
  • 企业常用Linux文件命令相关知识+小案例
  • Istio介绍
  • 代码随想录算法训练营第四十七天|leetcode115、392题
  • 将Ubuntu18.04默认的python3.6升级到python3.8
  • Python和Java哪个更适合后端开发?
  • Python+pytest接口自动化之cookie绕过登录(保持登录状态)
  • 什么数据集成(Data Integration):如何将业务数据集成到云平台?
  • 国外EDM邮件群发多少钱?哪个软件好?
  • C语言入门算法——回文数
  • OceanBase—操作实践
  • 智慧用电安全管理系统
  • Rust语言入门第二篇-Cargo教程
  • 测试用例的编写方式