「笔记」递归算法复杂度分析

news/2024/10/7 6:41:27

目录
  • 写在前面
  • 递归算法形式
  • 递归树大力求和
  • 主定理 Master Theorem
  • 典题
    • 1
    • 2
    • 3
    • 4
  • 写在最后

写在前面

可恶的算法分析与设计!!!

递归算法形式

对于一个输入规模为 \(n\) 的递归算法,每次均为将整个问题划分为 \(a\) 个规模为 \(\frac{n}{b}\) 的子问题,回溯时将所有子问题合并需要 \(f(n)\) 的时间,定义函数 \(T(n)\) 代表该递归算法所需时间,则有递推式:

\[\forall n>b,\ T(n) = aT\left(\frac{T}{b}\right) + f(n) \]

递归树大力求和

根据递推式画出递归树。对于上述递归式其递归树形如:

  1. 根节点代表规模为 \(n\) 的原问题。
  2. 对于规模为 \(x\) 的节点,其子节点数为 \(a\),代表该问题分治后的所有规模为 \(\frac{x}{b}\) 的子问题。
  3. 对于规模为 \(x\) 的问题对应的子节点,节点上的值为 \(f(x)\)
  4. 每层的右侧标出当前层中所有节点的和。

对递归树逐层右侧的值求和求和即得 \(T(n)\) 的值。

一个实例:

图片来源:https://blog.csdn.net/ypxcan/article/details/120452530

主定理 Master Theorem

对于上述函数 \(T(n)\),有:

\[\forall n>b,\ T(n) = aT\left(\frac{T}{b}\right) + f(n) \]

\[T(n) = \begin{cases}\Theta(n^{\log_b a}) &\exists \epsilon > 0, f(n) = O(n^{\log_b (a) - \epsilon}) &(1)\\\Theta (f(n)) &\exists \epsilon\ge 0, f(n) = \Omega(n^{\log_b (a) + \epsilon}) &(2)\\\Theta(n^{\log_b a} \log^{k + 1} n) &\exists k\ge 0, f(n) = \Theta(n^{\log_b a}\log^k n) &(3) \end{cases}\]

特别地,情况(2)中还需满足存在常数 \(c<1\),当 \(n\rightarrow +\infin\)\(af\left(\frac{n}{b}\right)\le cf(n)\) 恒成立。

证明即考虑将上述时间含义的递归树并逐层求和,上述公式中莫名奇妙的 \(n^{\log_b a}\) 实际上即为递归树最底层的所需时间为 \(\Theta(1)\) 的子问题数量。具体证明过程详见 OI-wiki。

根据证明过程可以得到上述三种情况分别代表的实际情况:

  • (1)瓶颈在于处理所有叶节点所需时间 \(\Theta(1)\times O(n^{\log_b a})\)
  • (2)瓶颈在于分割与合并过程 \(f(n)\)
  • (3)分割与合并过程与处理所有叶节点所需时间同级,上述额外限制 \(af\left(\frac{n}{b}\right)\le cf(n)\) 即限制了原问题分割后子问题的增长速率不会超过其本身。

典题

大部分情况下可以直接套主定理秒了,如果套不上公式只能大力求和。

1

\[T(n) = \begin{cases}1 &(n = 1)\\ 2T\left(\frac{n}{2}\right) + 1 &(n>1) \end{cases}\]

\(a = 2, b = 2, \log_b a = \log_2 2 = 1\)。当取 \(\epsilon \in (0, 1]\) 时,有 \(f(n) = O(n^{\log_b (a) - \epsilon}) = O(n^{1 - \epsilon})\),则由主定理(1)有:

\[T(n) = \Theta(n^{\log_b a}) = \Theta(n) \]

2

\[T(n) = \begin{cases}1 &(n = 1)\\ T\left(\frac{n}{2}\right) + n &(n>1) \end{cases}\]

\(a = 1, b = 2, \log_b a = \log_2 1 = 0\)。当取 \(\epsilon \in (0, 1]\) 时,有 \(f(n) = \Omega(n^{\log_b (a) + \epsilon}) = O(n^{\epsilon})\),则由主定理(2)有:

\[T(n) = \Theta(f(n)) = \Theta(n) \]

3

\[T(n) = \begin{cases}1 &(n = 1)\\ 2T\left(\frac{n}{2}\right) + n &(n>1) \end{cases}\]

即为归并排序的复杂度。递归树见上述图片实例。

\(a = 2, b = 2, \log_b a = \log_2 2 = 1\)。当取 \(k = 0\) 时,有 \(f(n) = \Theta(n^{\log_b a}\log^k n) = \Theta(n)\),则由主定理(3)有:

\[T(n) = \Theta(n^{\log_b a}\log^{k + 1} n) = \Theta(n\log n) \]

4

\[T(n) = \begin{cases}1 &(n = 1)\\ 2T\left(\frac{n}{2}\right) + n\log n &(n>1) \end{cases}\]

CDQ 分治的复杂度。

\(a = 2, b = 2, \log_b a = \log_2 2 = 1\)。当取 \(k = 1\) 时,有 \(f(n) = \Theta(n^{\log_b a}\log^k n) = \Theta(n\log n)\),则由主定理(3)有:

\[T(n) = \Theta(n^{\log_b a}\log^{k + 1} n) = \Theta(n\log^2 n) \]

写在最后

奇怪的是网络上搜到的主定理的定义都是不完全的,比如以下参考中指出的那篇,在他们的定义下会出现明明可以适用主定理但是不存在于定义中的情况。为什么会有这种残疾版的定义?莫名奇妙!

要不是我现在妈的忙着傻逼期末我一定去溯源妈的傻逼期末

参考:

  • 复杂度 - OI Wiki
  • 深入浅出理解主定理原理(Master theorem)如何计算递归时间复杂度 - RESTKHZ
  • 注意此文种主定理的定义是不完全的:三种方法求递归算法的时间复杂度(递推,master定理,递归树)_递归时间复杂度-CSDN博客
  • 重谈主定理(master定理)及其证明 - Jayun - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/42842.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

NOIP2024模拟12:孤帆远影

这两次模拟赛都不是很专注!T1两次都G掉了!迅速调整状态,专注于自己的思考,打好草稿!NOIP2024模拟12:孤帆远影听了机房同学的讨论,于是T1死磕冒泡和逆序对做法。最后只得了40pts。 思想对了,但不是自己的做法。 还是要坚持自己想,坚持自己可以想出来,不要被任何人带偏。T1一…

mORMot and Open Source friends SynProject Tutorial (SynProject教程)

mORMot and Open Source friends SynProject Tutorial--(SynProject 教程) 第一步 本页介绍SynProject的一些典型用法。 我们将为mORMot框架本身创建一个源代码存储库和相关的文档。 您要求文档,我们将通过SynProject自动生成它! 我们需要什么 因此,我们在硬盘上的D:\Dev\Li…

计算机简史第四章 电子时代之图灵机

讲讲图灵对计算机的贡献讲讲图灵对计算机的贡献 ‍ 图灵机发明的背景 阿兰马蒂森图灵 (Alan Mathison Turing)于 1921 年出生在伦敦, 从小就表现出惊人数学和科学能力。 ​​ 艾伦麦席森图灵(Alan Mathison Turing),1912-1954,英国数学家、计算机学家、逻辑学家、密码学…

Django5的环境安装

Django是基于Python的Web框架,依赖Python环境,所以需要提前安装好Python解释器。 关于Python的安装,请参考https://www.liujiangblog.com中Python教程的相关部分,这里不再赘述。 截至2024年初,Django的最新版本为5.0,发布于2023年12月,预计2025年结束支持。 Django5.0支…

如何管理文件 2024年6月10日

如何管理文件 2024年6月10日一、简介:本文的文件是指人在日常工作、生活、娱乐、交流过程中形成的各种形式的信息记录。信息记录的集合构成了文件。有的文件可以用Microsoft Office 办公软件打开,有的文件可以被MX Player、IINA播放器、完美解码播放器等各种电子设备平台中的…

statistical_c02

1. 点估计1.1 最大似然估计1.1.1 似然函数 1.1.2 最大似然估计 1.1.3 最大似然估计例子1.2 矩估计(Method of Moments, MoM)1.2.1 矩估计思想1.3 估计量的评选标准2. 区间估计2.1 置信区间2.1.1 置信区间引入 2.1.2 置信区间2.2 单个正态总体的均值和方差的置信区间2.2.1 正态…

python爬虫笔记——学习笔记—6

爬虫笔记——学习笔记—6 1.安装scrapy 打开此电脑 ![img](file:///C:/Users/Administrator/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png 在桌面的上栏目输入cmd并打开再命令框中升级python:python -m pip install –upgradepip 安装scrapy : pip install scrapy 安…

PyQT5之QSS基础/子控件选择器

from PyQt5.QtWidgets import * import sysclass BasicQCSS(QWidget):def __init__(self):super().__init__()self.setWindowTitle("QSS样式/子控件选择器")btn1 = QPushButton(self)btn1.setText("按钮1")btn1.setProperty("name", btn1)btn2 =…