前言

在运用分治法将原问题分解成多个子问题后,通常可以得到一个关于时间复杂度的递归式,如T(n)=T(n/2)+O(1),如何求解递归式并得出该算法的时间复杂度O(f(n))就是我们要解决的问题。一般来说,有三种方法可以供我们选择,代入法、递归树法和公式法(即《算法导论》中所描述的主方法)。下面先从代入法开始讲起。


代入法

一、基本步骤

  1. 猜测解的形式,
  2. 运用第二类数学归纳法,证明存在常数c使得 

二、数学归纳法

定义

数学归纳法是代入法的核心,此处使用的是其第二种形式,其具体过程如下:

  1. 当  时,命题成立;
  2. 假设当  时,命题成立,由此可推得当  时,命题也成立。

我们用一个例子来说明用数学归纳法证明递归式的解的过程。


例:求递归式  的渐进上界。

解:第一步猜测的时候需要一些经验,观察递归式和已知确界的式子是否相似,选取相应的解的形式。这里我们猜测 ,然后用数学归纳法证明其正确性。

假设存在,使得对  的所有正整数k都有 特别地, 也满足这个不等式,即 。下面推导  的情况也满足该不等式。

时,上式成立。由此可知,数学归纳法证明了该递归式的解就是 


实用技巧

1.改变初始条件

上例中忽略了初始条件的检查,即保证  时有。显然这并不成立,数学归纳法失效。注意,在渐进上界的定义中,只要当n大于某个数之后的所有情况都满足 ,那么就有 。因此我们可以把初始条件往后挪一下,让作为归纳的起点, 完全可以找到相应的c的值使其成立,这样数学归纳法就可以进行下去了。今后在使用代入法的时候,我们总可以经过往后挪几个的操作使初始条件满足递归式,所以就不再赘述,仅关注数学归纳法的第二步,演绎推理的过程。

2.换元法

恰当地使用换元法将复杂且不熟悉的递推式转变成我们熟悉的形式,然后再直接写出解并回代能更快的解决一些问题。如

它看似很复杂,但是当我们考虑为整数,并作换元  后,得到

令 ,则上式可以写为 ,这是我们熟悉的形式,可以直接写出答案。

附录

在计算时间复杂度时经常要用到几个概念,现将其准确的定义列出。需要注意的是,其中所有的函数都要求渐进非负。

O记号-渐进上界

,存在正常数,使得对所有的,有

记号-渐进下界

,存在正常数,使得对所有的,有

记号-渐进确界

,存在正常数 和,使得对所有的,有

定理

对任意两个函数,当且仅当时,有

分治算法中的数学——求解递归式(代入法)相关推荐

  1. 递归式-代入法求解过程

    代入法 substitution method Guess the from of the solution verify by induction solve the consts example ...

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

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

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

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

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

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

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

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

  6. 4.3—代入法求解递归式

    对于代入法求解递归式,有以下自己的感触: 1.中间的证明过程用到了数学归纳法的思想: (1)首先证明初始条件是不是满足的,例如T(n)=O(nlgn),首先得验证当n=1的时候是不是满足条件,这里还牵 ...

  7. Algorithm:【Algorithm算法进阶之路】之算法中的数学编程相关习题(时间速度、进制转换、排列组合、条件概率、斐波那契数列)

    Algorithm:[Algorithm算法进阶之路]之算法中的数学编程相关习题(时间速度.进制转换.排列组合.条件概率.斐波那契数列) 目录 时间速度 排列组合 进制转换 条件概率 斐波那契数列 时 ...

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

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

  9. 用代入法求解递归式里的”微妙细节“【算法导论P49】

    当利用归纳法证明一个上界时,实际上证明一个更弱的上界可能会更难一些,因为为了证明一个更弱的上界,我们在归纳证明中也必须使用同样更弱的界. 例如: 考虑一下的递归式: T(n)=4T(n/3)+n 知道 ...

最新文章

  1. 【廖雪峰Python学习笔记】错误、调试、测试
  2. 更改ORACLE归档路径及归档模式
  3. git merge 和 git merge --no-ff
  4. IDEA设置虚拟机参数
  5. pandas读取excel,设置默认读取类型
  6. SSM中 出现错误 Could not open ServletContext resource [/WEB-INF/dispatcherServlet-servlet.xml]
  7. regex match
  8. 如何在麦田拍出小清新?
  9. k8s学习:WordPress + MySQL + PVC 构建一个博客网站
  10. SecureCRT在linux与windows本地互传文件之SFTP
  11. 架构师必备之最全最系统的 Android 界面性能调优资料
  12. thymeleaf 消息推送_SpringBoot整合WebSocket实现消息推送
  13. 400款营销策划PPT模板免费下载
  14. 顶级摄影师的磨皮美白利器Portraiture,支持搭配微设证件大师使用
  15. win10开启管理员账户
  16. elementUi中的图片预览功能(图片放大、缩小)preview-src-list属性
  17. 7.2 MVC 实现登录验证
  18. Nova组件源码分析之冷迁移与Resize
  19. 交换原理-QOS TD与WRED
  20. 记录战斗记录你,详解妖尾战斗录像系统

热门文章

  1. ConcurrentHashMap 如何保证线程安全
  2. python读取excel公式计算结果为none_python读取excel保存公式无法读取
  3. php curl函数出现乱码
  4. php curl返回结果乱码,curl获取结果乱码的解决方法
  5. 狂神说Java-多线程学习笔记
  6. cpu频率监控linux系统,一种用于Linux的CPU压力测试监控方法与流程
  7. 安装win10提示“我们无法创建新的分区,也找不到现有分区”
  8. [转]Linux 配置双显示器 (原文名: Ubuntu 8.04/8.10 设置笔记本电脑双显示器)
  9. 价值升维 用友BIP夯实大型企业数智化平台底座
  10. C语言实验——判断素数(循环结构) -java