分治策略时间复杂度分析(一)-用代入法求解递归式

2023-11-02

分治策略时间复杂度分析(一)-用代入法求解递归式

分治策略是算法中的一种重要的思想,比如归并排序就是用到了分治的策略,在分治策略中我们递归地求解一个问题,在每一层递归中都应用三个步骤:1.分解、2.解决、3.合并



前言

进行分治策略时间复杂度分析有三种方法,分别为

  • 1.用代入法求解递归式
  • 2.用递归树方法求解递归式
  • 3.用主方法求解递归式
    本篇文章介绍第一种方法,即用代入法来求解递归式,这也是最省事、最容易理解的一种方法。

一、代入法初探

代入法求解递归式分为两步:

  1. 猜测解的形式。
  2. 用数学归纳法求出解中的常数,并且证明解是正确的。

 当将归纳假设应用于较小的值时,我们将猜测的解代入函数,因此得名“代入法”。这种方法很强大,但是我们必须能够猜出解的形式,以便将其代入。
  我们可以用代入法为递归式建立上界或者下界。例如我们确定下面递归式的上界:
T ( n ) = 2 T ( ⌊ n / 2 ⌋ ) + n ( 1.1 ) T(n)=2T(\lfloor n/2\rfloor)+n \qquad \qquad(1.1) T(n)=2T(n/2)+n(1.1)
 我们猜测其解为 T ( n ) = O ( n l g n ) T(n)=O(nlgn) T(n)=O(nlgn),代入法要求证明,恰当选择常数c>0,可有 T ( n ) ≤ c n l g n T(n)\leq cnlgn T(n)cnlgn。首先假定此上界对所有正数m<n都成立,特别是对于 m = ⌊ n / 2 ⌋ m=\lfloor n/2 \rfloor m=n/2,有 T ( ⌊ n / 2 ⌋ ) ≤ c ⌊ n / 2 ⌋ l g ( ⌊ n / 2 ⌋ ) T(\lfloor n/2 \rfloor) \leq c \lfloor n/2 \rfloor lg(\lfloor n/2 \rfloor) T(n/2)cn/2lg(n/2)。我们将其代入到递归式,有
T ( n ) ≤ 2 ( c ⌊ n / 2 ⌋ l g ( ⌊ n / 2 ⌋ ) ) + n ≤ c n l g ( n / 2 ) + n = c n l g n − c n l g 2 + n = c n l g n − c n + n ≤ c n l g n T(n)\leq 2(c\lfloor n/2 \rfloor lg(\lfloor n/2 \rfloor))+n\leq cnlg(n/2)+n \\ =cnlgn-cnlg2+n=cnlgn-cn+n\leq cnlgn T(n)2(cn/2lg(n/2))+ncnlg(n/2)+n=cnlgncnlg2+n=cnlgncn+ncnlgn
  其中,只要 c ≥ = 1 c\geq=1 c=1,最后一步都会成立。
  数学归纳法要求我们证明解在边界条件下也成立。为了证明这一点,我们通常证明对于归纳证明,边界条件适合作为基本情况。 对于递归式1.1我们必须证明,通过选择足够大的常数项c,可以使得上界 T ( n ) ≤ c n l g n T(n)\leq cnlgn T(n)cnlgn对边界条件也成立。这一要求可能会产生问题。例如为了方便讨论,假设T(1)=1 是递归式唯一的边界条件。对于n=1,边界条件 T ( n ) ≤ c n l g n T(n)\leq cnlgn T(n)cnlgn推导出 T ( 1 ) ≤ c 1 l g 1 = 0 T(1)\leq c1lg1=0 T(1)c1lg1=0,这与T(1)=1矛盾。因此,我们的归纳证明的基本情况不成立。
 对于上面这种情况,我们采用如下的对应策略:在递归式1.1中,渐进符号仅要求我们对 n ≥ n 0 n\geq n_0 nn0,这样子的话对于n>3也好,n>2也好,归纳法并不是直接以来T(1)。

二、做出好的猜测

 然而,比较遗憾的是,并没有通用的方法允许我们去直接猜测得到递归式的正确解。我们需要不断地积累经验。

  1. 如果要求解的递归式和你曾经见过的递归式相似,那么我们可以猜测一个类似的解。例如下面的递归式:
    T ( n ) = 2 T ( ⌊ n / 2 ⌋ + 17 ) + n T(n)=2T(\lfloor n/2 \rfloor+17)+n T(n)=2T(n/2+17)+n
    这个看起来比较困难,因为在等式的右边T的参数中增加了17,但是在直观上,增加的这一项并不会显著地影响递归式的解。当n较大时 ⌊ n / 2 ⌋ \lfloor n/2 \rfloor n/2 ⌊ n / 2 ⌋ + 17 \lfloor n/2 \rfloor+17 n/2+17的差距并不大,因此我们可以推测T(n)=O(nlgn)
  2. 另外一种方案是线证明递归式比较松的上界和下界,然后缩小不确定的范围。例如对于式1.1,我们可以从下界 T ( n ) = Ω ( n ) T(n)=\Omega(n) T(n)=Ω(n)开始,因为递归式中包含着n这一项,还可以证明一个初始上界 T ( n ) = O ( n 2 ) T(n)=O(n^2) T(n)=O(n2)。然后,我们就可以逐步地降低上界,提升下界,直到收敛到渐进紧确界 T ( n ) = Θ ( n l g n ) T(n)=\Theta(nlgn) T(n)=Θ(nlgn)

三、微妙的细节

  有的时候,我们可能猜出了正确的递归式解的渐进界,但是莫名奇妙地在归纳证明的时候失败了。问题常常出在归纳假设不够强,无法证出准确的界。当遇到这种障碍的时候,我们将它减去一个低阶的项,数学证明常常就能够顺利地进行。
 考虑以下的递归式:
T ( n ) = T ( ⌊ n / 2 ⌋ ) + T ( ⌈ n / 2 ⌉ ) + 1 T(n)=T(\lfloor n/2 \rfloor)+T(\lceil n/2 \rceil)+1 T(n)=T(n/2)+T(n/2)+1
我们猜测解为T(n)=O(n),并且尝试证明对某个恰当选出的常数c, T ( n ) ≤ c n T(n)\leq cn T(n)cn成立。将我们的猜测代入到递归式,得到
T ( n ) ≤ c ⌊ n / 2 ⌋ + c ⌈ n / 2 ⌉ + 1 = c n + 1 T(n)\leq c\lfloor n/2 \rfloor+c\lceil n/2 \rceil +1=cn+1 T(n)cn/2+cn/2+1=cn+1
但是这不是我们想要的,这个也并不意味着对于任意的c都有 T ( n ) ≤ c n T(n)\leq cn T(n)cn
  从直觉上看,我们的猜测是接近正确的:只差一个常数1,一个低阶项。但是,除非我们证明与归纳假设严格一致的形式,否则数学归纳法还是会失败的。克服这个困难的一个方法是从先前的猜测中减去一个低阶项。 所以新的猜测为 T ( n ) ≤ c n − d T(n)\leq cn-d T(n)cnd,d是大于0的一个常数。我们现在有
T ( n ) ≤ ( c ⌊ n / 2 ⌋ − d ) + ( c ⌈ n / 2 ⌉ − d ) + 1 = c n − 2 d + 1 ≤ c n − d T(n)\leq (c\lfloor n/2 \rfloor -d )+(c\lceil n/2 \rceil-d )+1 \\ =cn-2d+1\leq cn-d T(n)(cn/2d)+(cn/2d)+1=cn2d+1cnd
只要 d ≥ 1 d\geq1 d1,此式就成立。与以前一样,我们必须选择足够大的c来处理边界条件。

四、避免陷阱

使用渐进符号很容易出错。例如,在递归式(1.1)中,我们可能错误地“证明”T(n)=O(n):猜测 T ( n ) ≤ c n T(n)\leq cn T(n)cn,并且论证:
T ( n ) ≤ 2 ( c ⌊ n / 2 ⌋ ) + n ≤ c n + n = O ( n ) 错 误 ! ! ! T(n) \leq 2(c\lfloor n/2 \rfloor)+n\leq cn+n=O(n) 错误!!! T(n)2(cn/2)+ncn+n=O(n)!!!
因为c是常数,错误在于我们并未证出与归纳假设严格一致的形式,即 T ( n ) ≤ c n T(n)\leq cn T(n)cn。因此,当要证明 T ( n ) = O ( n ) T(n)=O(n) T(n)=O(n)时,必须要显式地证出 T ( n ) ≤ c n T(n)\leq cn T(n)cn

五、改变变量

  有时,一个小的代数运算可以将一个未知的递归式变成我们所熟悉的形式。例如,考虑如下递归式:
T ( n ) = 2 T ( ⌊ n ⌋ ) + l g n T(n)=2T(\lfloor \sqrt n\rfloor)+lgn T(n)=2T(n )+lgn
它看起来很困难。但是我们可以通过改变变量来简化它。为了方便起见,我们不必担心值的舍入误差问题,只考虑 n \sqrt n n 是整数的情形即可。令m=lgn,得到
T ( 2 m ) = 2 T ( 2 m / 2 ) + m T(2^m)=2T(2^{m/2})+m T(2m)=2T(2m/2)+m
现在重新命名 S ( m ) = T ( 2 m ) S(m)=T(2^m) S(m)=T(2m),得到新的递归式:
S ( m ) = 2 S ( m / 2 ) + m S(m)=2S(m/2)+m S(m)=2S(m/2)+m
可以很轻松地求得这个递归式的解为S(m)=O(mlgm)。再从S(m)转换回T(n),我们得到 T ( n ) = T ( 2 m ) = S ( m ) = O ( m l g m ) = O ( l g n l g l g n ) T(n)=T(2^m)=S(m)=O(mlgm)=O(lgnlglgn) T(n)=T(2m)=S(m)=O(mlgm)=O(lgnlglgn)

总结

代入法是求递归式的一个基础方法,我在此做一个笔记,也希望可以帮助到你!

参考文档: 《算法导论》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分治策略时间复杂度分析(一)-用代入法求解递归式 的相关文章

随机推荐

  • efci 计算机网络,基于ABR业务的ATM网络拥塞控制算法研究及其在交换机中的应用...

    摘要 由于传统的电路交换资源利用率低 而传统的分组交换保证不了服务质量且交换速度慢 因此一种新的网络技术 ATM网络技术应运而生 ATM为了保证其QoS 将其业务划分为恒定比特率 CBR 实时可变比特率 rt VBR 非实时可变比特率 nr
  • win10怎么改管理员名字_一招开启win10“最强”模式,让你的电脑性能急速飙升!...

    Win10作为新一代的操作系统 虽然在兼容性和稳定性方面不如win7 但是不可否认的是 win10系统在功能方面的优化还是做得十分不错的 当然 也正是因为win10系统这方面的优化 使得win10安装之后 需要比较大的空间以及比较好的硬件配
  • Ubuntu语言支持没有完整安装

    来源 解决方法就是输入如下命令 sudo apt install check language support 接下来就是一段时间的等待过程
  • centos8 网络配置

    目录 centos8已经发布了 下载了一个体验一下 新安装好的centos8默认网卡是没有启动的 安装好后需要先配置网络 在 etc sysconfig network scripts目录下存放着网卡的配置文件 文件名称是ifcfg 网卡名
  • 调用接口登录禅道_Java调用禅道api接口查询以及创建任务(傻瓜式复制粘贴--专业版禅道页面调用)

    背景 系统需要调用禅道的接口进行工单的创建 并对工单进行附件上传等信息的操作 禅道接口为http接口 每次请求都需要带上zentaosid进行请求 1 配置常量类 ClassName ZenTaoConstants Description
  • Shell脚本之数组

    一 含义 数组的每个元素的分隔符一定是空格 用于区分数组的各个元素的数字编号称为下标 元素的下标从0开始 组成数组的各个变量称为数组的分量 也称为数组的元素 有时也称为下标变量 二 定义数组 方法1 数组名 value0 value1 va
  • layout_gravity不能居中以及失效、无法使用问题的解决办法

    layout gravity不能居中以及失效 无法使用问题的解决办法 今天在工作中遇到了关于layout gravity属性失效的问题 在查阅了相关资料后 了解到了一些解决的办法 顺便写一篇文章记录一下 首先 先了解一下layout gra
  • 微服务开发的意义 微服务与分布式的关系

    意义 将单体应用拆分为一组小服务 协同工作 小而自治 每个服务在独立的进程运行 服务之间使用轻量级的通信机制RPC 单一职责 一个微服务解决一个业务问题 注意是一个业务问题而不是一个接口 服务围绕业务构建 服务可以独立部署 低耦合 面向服务
  • debian 文件夹中文件大小_Debian基本设置笔记

    易用的东西 不用看说明 上手就可以直接用起来 正常的东西 需要搜说明 搜个两三次 也就记住了 而类似设置Linux这种东西 每次用 都要每次重新搜来搜去 试来试去 本科的时候 在一位来自衡中的同学指导下 安装了一个Debian with x
  • ajax和mybatis,Springboot+Ajax+Mybatis+Mysql实现异步登录

    本人大学生 搞了三年的 PHP 感觉 PHP 的生态还是不行 但是 PHP 仍然是全世界最好的语言 上手简单 能快速搭建起一个项目 由于快要找工作了想花一年的时间来搞搞 Java 搞了一段时间后发现 Java 整套是真是完善 可扩展性很强
  • 关于benchmark的Instruction Cache Misses测试

    指令高速缓存未命中与数据高速缓存未命中相似 都是由于高速缓存已满而造成其它指令被冲出 也被称为capacity misses 为了测试指令的cache misses和memory相关信息 一般可使用perf工具或 Intel VTune 关
  • 使用Airtest IDE进行web自动化测试

    最近在使用selenium进行web自动化测试脚本的编写 但是定位很麻烦 编写耗时耗力 于是便在网上寻找有没有类似的测试工具 经过一段时间的寻找 终于找到一款网易开发的开源自动化测试工具 Airtest IDE 官网地址 Airtest P
  • IT行业接项目的方法总结(接私活可用)

    首先了解下众包和外包的区别 外包 外包是将项目承包给外包公司 由外包公司的程序员进行开发 众包 众包是将项目承包给多个独立的开发者 他们不隶属于任何公司 用自己的业余时间接私活 进行开发 接单的方法 朋友介绍 如果自己工作的时间长 熟悉软件
  • Double Machine Learning

    1 从线性回归说起 从观测数据获得因果效应的一个简单方式是使用线性回归 控制confounders的影响 S a l e s i
  • kafka+java工具类_Kafka工具类(Scala)

    1 配置文件config properties Kafka配置 kafka broker list hadoop300 9092 hadoop301 9092 hadoop302 9092 Redis配置 redis host hadoop
  • 用QT实现同步调用WebService

    QT提供了QNetworkAccessManager来访问 QT帮助文档里有这么一段 QNetworkAccessManager manager new QNetworkAccessManager this connect manager
  • Atlas200

    Atlas200 https bbs huaweicloud com forum thread 22913 1 1 html https ascend huawei com documentation details zh v1 1 1 1
  • 在Vue中实现全屏背景图片

    background url xx images 图片名字 jpg 这里的地址是用你项目中图片所在的路径为准 background repeat no repeat 将图片样式不重复 background size 100 100 设置图片
  • Unity简易实现角色脚下光圈

    方案一 使用Projector投影 最终效果 准备工作 1 一张背景为透明的圆圈图案 我这里是从阿里巴巴矢量网搜索圆圈下载到的 2 Standard Assets资源包 去AssetStore下载通用资源包 需要用到里面的light sha
  • 分治策略时间复杂度分析(一)-用代入法求解递归式

    分治策略时间复杂度分析 一 用代入法求解递归式 分治策略是算法中的一种重要的思想 比如归并排序就是用到了分治的策略 在分治策略中我们递归地求解一个问题 在每一层递归中都应用三个步骤 1 分解 2 解决 3 合并 文章目录 分治策略时间复杂度