分治算法中的数学——求解递归式(代入法)
前言
在运用分治法将原问题分解成多个子问题后,通常可以得到一个关于时间复杂度的递归式,如T(n)=T(n/2)+O(1),如何求解递归式并得出该算法的时间复杂度O(f(n))就是我们要解决的问题。一般来说,有三种方法可以供我们选择,代入法、递归树法和公式法(即《算法导论》中所描述的主方法)。下面先从代入法开始讲起。
代入法
一、基本步骤
- 猜测解的形式,
- 运用第二类数学归纳法,证明存在常数c使得
二、数学归纳法
定义
数学归纳法是代入法的核心,此处使用的是其第二种形式,其具体过程如下:
- 当 时,命题成立;
- 假设当 时,命题成立,由此可推得当 时,命题也成立。
我们用一个例子来说明用数学归纳法证明递归式的解的过程。
例:求递归式 的渐进上界。
解:第一步猜测的时候需要一些经验,观察递归式和已知确界的式子是否相似,选取相应的解的形式。这里我们猜测 ,然后用数学归纳法证明其正确性。
假设存在,使得对 的所有正整数k都有 ,特别地, 也满足这个不等式,即 。下面推导 的情况也满足该不等式。
当时,上式成立。由此可知,数学归纳法证明了该递归式的解就是 。
实用技巧
1.改变初始条件
上例中忽略了初始条件的检查,即保证 时有。显然这并不成立,数学归纳法失效。注意,在渐进上界的定义中,只要当n大于某个数之后的所有情况都满足 ,那么就有 。因此我们可以把初始条件往后挪一下,让作为归纳的起点, 完全可以找到相应的c的值使其成立,这样数学归纳法就可以进行下去了。今后在使用代入法的时候,我们总可以经过往后挪几个的操作使初始条件满足递归式,所以就不再赘述,仅关注数学归纳法的第二步,演绎推理的过程。
2.换元法
恰当地使用换元法将复杂且不熟悉的递推式转变成我们熟悉的形式,然后再直接写出解并回代能更快的解决一些问题。如
它看似很复杂,但是当我们考虑为整数,并作换元 后,得到
令 ,则上式可以写为 ,这是我们熟悉的形式,可以直接写出答案。
附录
在计算时间复杂度时经常要用到几个概念,现将其准确的定义列出。需要注意的是,其中所有的函数都要求渐进非负。
O记号-渐进上界
,存在正常数和,使得对所有的,有。
记号-渐进下界
,存在正常数和,使得对所有的,有。
记号-渐进确界
,存在正常数、 和,使得对所有的,有。
定理
对任意两个函数和,当且仅当且时,有。
分治算法中的数学——求解递归式(代入法)相关推荐
- 递归式-代入法求解过程
代入法 substitution method Guess the from of the solution verify by induction solve the consts example ...
- 【算法导论-主定理】用主方法求解递归式 学练结合版
问题:若某算法的计算时间表示为递推关系式:T(N)=2T(N/2)+NlogN 且 T(1)=1 则该算法的时间复杂度为( ). O(Nsqrt(N)) O(NlogN) O(N(logN)^2) O ...
- 第四章 分治策略 4.4 用递归树方法求解递归式
4.4 用递归数方法求解递归式 一. 1. 在递归树中,每个结点表示一个单一子问题的代价,子问题对应某次递归函数调用.我们将树中每层中的代价求和,得到每层代价,然后将所有层的代价求和,得到所有层次 ...
- 算法导论 — 4.4 用递归树方法求解递归式
笔记 在应用代入法求解递归式时,需要事先做出一个好的猜测.然而,有时候做出好的猜测是很困难的,此时可以考虑采用递归树方法.在递归树中,每个结点表示一个单一子问题的代价.创建递归树之后,对树的每层的各子 ...
- 用递归树方法求解递归式
用递归树方法求解递归式 [备注:需要修改] 一个递归算法的递归式:T(n)=3T(n/4)+cn2T\left(n\right)=3T\left(n/4\right)+cn^2T(n)=3T(n/4) ...
- 4.3—代入法求解递归式
对于代入法求解递归式,有以下自己的感触: 1.中间的证明过程用到了数学归纳法的思想: (1)首先证明初始条件是不是满足的,例如T(n)=O(nlgn),首先得验证当n=1的时候是不是满足条件,这里还牵 ...
- Algorithm:【Algorithm算法进阶之路】之算法中的数学编程相关习题(时间速度、进制转换、排列组合、条件概率、斐波那契数列)
Algorithm:[Algorithm算法进阶之路]之算法中的数学编程相关习题(时间速度.进制转换.排列组合.条件概率.斐波那契数列) 目录 时间速度 排列组合 进制转换 条件概率 斐波那契数列 时 ...
- 主定理(主方法)求解递归式
1.主方法使用条件 用主方法求解递归式有条件,必须要求递归式为以下形式: 其中a>=1,b>1,f(n)渐进趋正,意为对足够大的n,f(n)是正的,即n>= n 0 n_0 n0时 ...
- 用代入法求解递归式里的”微妙细节“【算法导论P49】
当利用归纳法证明一个上界时,实际上证明一个更弱的上界可能会更难一些,因为为了证明一个更弱的上界,我们在归纳证明中也必须使用同样更弱的界. 例如: 考虑一下的递归式: T(n)=4T(n/3)+n 知道 ...
最新文章
- 【廖雪峰Python学习笔记】错误、调试、测试
- 更改ORACLE归档路径及归档模式
- git merge 和 git merge --no-ff
- IDEA设置虚拟机参数
- pandas读取excel,设置默认读取类型
- SSM中 出现错误 Could not open ServletContext resource [/WEB-INF/dispatcherServlet-servlet.xml]
- regex match
- 如何在麦田拍出小清新?
- k8s学习:WordPress + MySQL + PVC 构建一个博客网站
- SecureCRT在linux与windows本地互传文件之SFTP
- 架构师必备之最全最系统的 Android 界面性能调优资料
- thymeleaf 消息推送_SpringBoot整合WebSocket实现消息推送
- 400款营销策划PPT模板免费下载
- 顶级摄影师的磨皮美白利器Portraiture,支持搭配微设证件大师使用
- win10开启管理员账户
- elementUi中的图片预览功能(图片放大、缩小)preview-src-list属性
- 7.2 MVC 实现登录验证
- Nova组件源码分析之冷迁移与Resize
- 交换原理-QOS TD与WRED
- 记录战斗记录你,详解妖尾战斗录像系统
热门文章
- ConcurrentHashMap 如何保证线程安全
- python读取excel公式计算结果为none_python读取excel保存公式无法读取
- php curl函数出现乱码
- php curl返回结果乱码,curl获取结果乱码的解决方法
- 狂神说Java-多线程学习笔记
- cpu频率监控linux系统,一种用于Linux的CPU压力测试监控方法与流程
- 安装win10提示“我们无法创建新的分区,也找不到现有分区”
- [转]Linux 配置双显示器 (原文名: Ubuntu 8.04/8.10 设置笔记本电脑双显示器)
- 价值升维 用友BIP夯实大型企业数智化平台底座
- C语言实验——判断素数(循环结构) -java