精华内容
下载资源
问答
  • 递归式求解-主方法
    千次阅读
    2017-10-25 11:07:36

    http://pytlab.org/2017/09/10/%E9%80%92%E5%BD%92%E5%BC%8F%E6%B1%82%E8%A7%A3-%E4%B8%BB%E6%96%B9%E6%B3%95/

    本文对递归式求解中很重要的主方法进行介绍总结。

    主方法

    主方法为如下形式的递归式提供了一种”菜谱式”的求解方法:

    T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)

    其中 a1,b>1 a≥1,b>1是常数, f(n) f(n)是渐进正数。

    上式描述了这样的一个算法运行时间: 他将原问题的规模为 n n的问题划分为 a a个小的子问题,每个子问题的规模为原来的 1b 1b a a个子问题递归的进行求解,每个花费时间为 T(n/b) T(n/b)。子问题合并的代价为 f(n) f(n)

    主定理

    这里我将书上的定义直接贴上来了。

    主方法依赖主定理:

    a1 a≥1 b>1 b>1是常数, f(n) f(n)是一个函数, T(n) T(n)是定义在非负整数上的递归式:

    T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)

    其中我们将忽略舍入问题 n/b n/b解释为 n/b ⌊n/b⌋ n/b ⌈n/b⌉, 那么 T(n) T(n)有如下渐进界:

    1. 若对某个常数 ϵ>0 ϵ>0 f(n)=O(nlogbaϵ) f(n)=O(nlogb⁡a−ϵ) T(n)=Θ(nlogba) T(n)=Θ(nlogb⁡a)
    2. f(n)=Θ(nlogba) f(n)=Θ(nlogb⁡a), 则 T(n)=Θ(nbalgn) T(n)=Θ(nbalgn)
    3. 若对某个常数 ϵ>0 ϵ>0 f(n)=Ω(nlogba+ϵ) f(n)=Ω(nlogba+ϵ), 且对某个常数 c<1 c<1和所有足够大的 n ny有 af(n/b)cf(n) af(n/b)≤cf(n), 则 T(n)=Θ(f(n)) T(n)=Θ(f(n))

    主定理的直观理解

    主定理其实主要是比较两个函数 f(n) f(n) nlogba nlogb⁡a, 其中较大的那个决定最终递归式的渐近解。

    1. nlogba>f(n) nlogb⁡a>f(n), 则就是情况1, 解就直接是 T(n)=Θ(nlogba) T(n)=Θ(nlogb⁡a)
    2. nlogba=f(n) nlogb⁡a=f(n), 则就是情况2, 解就需要在 f(n) f(n)的基础上乘上个对数因子 lgn lgn T(n)=Θ(nlogbalgn) T(n)=Θ(nlogb⁡algn)
    3. nlogba<f(n) nlogb⁡a<f(n), 则就是情况3, 解为 T(n)=Θ(f(n)) T(n)=Θ(f(n))

    主定理的细节理解

    多项式意义上大于

    主定理中,除了渐进大于(小于)以外,还有一个重要的概念就是多项式意义的大于(小于)(polynomially larger/smaller)

    多项式大于意味着函数的比值会渐进的落在两个多项式之间。 f(n) f(n)多项式意义上大于 g(n) g(n),当且仅当存在两个广义的多项式(分数指数也是可以的) p(n),q(n) p(n),q(n)使得如下不等式渐进成立:

    p(n)f(n)g(n)<q(n) p(n)≤f(n)g(n)<q(n)

    例如对于两个函数 n2 n2 nlgn nlgn, 我们有 n2nlgn=nlgn n2nlgn=nlgn,

    n13nlgnn n13≤nlgn≤n

    则函数 n2 n2多项式意义上大于 nlgn nlgn.

    主定理中的细节

    除了像上一部分那样有个大致的“大于”,“小于”的直观理解外,我们要理解定义中的具体细节,其实就是多项式大于/小于的应用。

    1. 第一种情况中,我们需要 f(n) f(n)多项式意义上小于 nlogba nlogb⁡a, 即 f(n) f(n)渐进小于 nlogbaϵ nlogb⁡a−ϵ。  f(n) f(n)必须渐近小于 nlogba nlogb⁡a, 同时要相差一个因子 nϵ , 其中 ϵ ϵ是大于0的常数。
    2. 第二种情况中,除了多项式意义上的大于以外,而且还要满足“正则”条件 af(n/b)cf(n) af(n/b)≤cf(n)

    但是主方法中的三种情况并不能覆盖所有此形式的情况。情况1和情况2之间有一定的间隙,即 f(n) f(n)渐近小于 nlogba nlogb⁡ad但不是多项式意义上的小于。同样的情况2和情况3也有类似的间隙。如果 f(n) f(n)满足的条件正好落在间隙中,或者不满足情况3中的“正则”条件,就不能通过主方法来求解了。

    例如求解如下递归式的时候:

    T(n)=2T(n/2)+nlgn T(n)=2T(n/2)+nlgn

    我们按照主方法, a=2,b=2,f(n)=nlgn a=2,b=2,f(n)=nlgn

    nlogba=nlog22=n nlogb⁡a=nlog2⁡2=n

    我们可以看到 f(n)=nlgn f(n)=nlgn 渐近大于  nlogba=n nlogb⁡a=n, 但是我们需要的是多项式意义上的大于即

    nlgn>nnϵ,ϵ>0 nlgn>n⋅nϵ,ϵ>0

    但是对于任意 ϵ>0 ϵ>0都无法满足 lgn lgn渐近大于 nϵ , 于是它并不是多项式意义上的大于,此递归式无法使用主方法来求解。

    使用主方法的例子

    对于矩阵乘法的Strassen方法递归式:

    T(n)=7T(n/2)+Θ(n2) T(n)=7T(n/2)+Θ(n2)

    a=7,b=2,f(n)=Θ(n2) a=7,b=2,f(n)=Θ(n2), 因此 nlogba=nlog27 nlogb⁡a=nlog2⁡7, 由于 2.8<lg7<2.81 2.8<lg7<2.81, 对于 ϵ=0.8 ϵ=0.8, 就有 f(n)=Θ(n2) f(n)=Θ(n2)多项式意义上大于 O(nlg7) O(nlg7), 于是我们便可以得到最终的解为:

    T(n)=Θ(nlg7)



    更多相关内容
  • 算法设计经常用到递归,而递归式是比较好写的,也是容易反应算法的设计思路的,我们分析含递归算法的时间复杂度就要求解递归式。1.主方法求解递归式 一种求解大部分递归式的公式。简洁实用,有兴趣的同学可以...

    本文转自博客:http://blog.csdn.net/qq_26010491/article/details/50616845
    下面介绍求解递归式的三种方法,以下方法参考《算法导论》,图片来自网络。算法设计经常用到递归,而递归式是比较好写的,也是容易反应算法的设计思路的,我们分析含递归算法的时间复杂度就要求解递归式。

    1.主方法求解递归式

        一种求解大部分递归式的公式。简洁实用,有兴趣的同学可以自己去看算法导论上的证明,这里只列举结论。

        给出递归式: T(n) = a * T(n/b) + f(n) ,其中a>=1,b>1,f(n)是给定的函数,T(n)是定义在非负整数上的递归式。
        这种方法要记忆三种情况,

    将余项f(n)与函数进行比较, 直觉上来说两个函数的较大者决定了递归式的解,如果两个函数相当,则乘上一个对数因子logn。

    这里要注意主方法不能求解的地方,所有的大于和小于都是多项式意义上的大于和小于,对于有些递归式夹在三种情况的间隙中,是无法用主方法来求解的。下面解释一下什么是多项式意义上的小于和大于:  

      f(x)多项式大于g(x):存在实数e>0,使得f(x)>g(x)*n^e
      f(x)多项式小于g(x):存在实数e>0,使得f(x)<g(x)*n^e

    举个例子,有递归式T(n) = 2T(n/2)+nlgn, = n,nlgn/n = lgn,此时不存在e>0,使得n*lgn>n*n^e,所以就不能用主方法求解。

    2.递归树求解

        用主方法求解不了的递归式,我们可以用递归树来猜测解的上界,然后用代入法来证明解的正确性。递归树的求解精确度取决于你画递归树的精确度。

         举例,

         画出它的递归树,

                                                  

           这里我们把递归树扩展到T(1)的层,然后以T(1)为单位把每层的代价求和,最后就是总的代价,需要注意的是,这里需要一定的数学知识。

    3.代入法

       比如我们求解,递归式T(n) = 2T(n/2)+n,我们猜测解是O(nlgn),我们要寻找到一个常数c,使得T(n)<=cnlgn

       即T(n) <= 2c(n/2)lg(n/2)+n <= cnlgn-cnlg2+n = cnlgn-cn+n

       只要c>=1,T(n)<=cnlgn,所以我们的猜测是正确的。

       要注意的是,代入法全凭经验,通常用递归树来确定上界,然后用代入法再证明。

    展开全文
  • 递归式求解

    2019-06-19 10:55:00
    然后按照递归树的迭代规则不断进行迭代,每迭代一次递归树就增加一层,直到树中不再含有权值为函数的结点(即叶结点都为T(1)T(1))。下面以递归方程 为例讲解递归树。 首先这道题肯定是没法用主定理,所以画...

    1. 主定理

    1.1 主定理介绍

    1.2 不能使用主定理的情况

    (1)T(n)不是单调函数,(e.g. T(n) = sinx)

    (2)f(n)不是多项式函数 (e.g. T(n) = T(n/2) + 2n)

    (3)b不能表示为一个常量(e.g. T(n) = 2T(√n))

    1.3 举例说明

    (1) T(n) = T(n/2) + 1/2 * n2 + n

    解:

    此时 a = 1, b = 2, f(n) =  1/2*n2 + n

    故 nlogba = n0= 1

    f(n) = Ω(nlogba+2),ε=2,且当 C = 1/4时,满足第三种情况的条件

    故第三种情况成立,T(n) = θ(n2)

     

    (2) T(n) = 2T(n/4) + √n + 42

    解:

    此时 a = 2, b = 4, f(n) = √n + 42

    故 nlogba = n1/2

    所以 f(n) = Θ(nlogba)

    故第二种情况成立,T(n) = Θ(nlogba*logn) = Θ(√n*logn)

     

    (3) T(n) = 3T(n/2) + 3/4*n + 1

    解:

    此时 a = 3, b = 2, f(n) = 3/4*n + 1

    故 nlogba = n

    所以 f(n) = O(nlogba-(logba-1)),ε = logba-1 = log23-1 > 0,

    故第一种情况成立,T(n) = Θ(nlogba) =  Θ(nlog23

    2. 递归树

    递归树是一棵结点带权值的树。初始的递归树只有一个结点,它的权标记为T(n);然后按照递归树的迭代规则不断进行迭代,每迭代一次递归树就增加一层,直到树中不再含有权值为函数的结点(即叶结点都为T(1)T(1))。下面以递归方程

    为例讲解递归树。

    首先这道题肯定是没法用主定理,所以画递归树:

    因为每次两个分支大小不相同,故这颗树实际上并不像画出来这样的平衡,故树高度最高为log2n最低为log4n

    我们假设极限树高为log2n即最大高度,且为平衡树,此时可以得到时间复杂度的上界:

     

    同理当极限树高为log4n时得到时间复杂度的下界:

     

    故可知时间复杂度为

    3. 找规律

    T(n) = 2T(n-1) + 1(T(1) = 1)

    这道题是不是看起来很像高中学的等比数列递推式,是的!
    如果方程右端出现T(n-1)这种式子,很有可能是递推式,再观察是等比还是等差数列,这道题很像等比,所以构造
    AT(n)+B = 2(T(n-1)+B)
    再和原式比较,得A = 1, B = 1,也就是说 T(n) +1 = 2(T(n-1) + 1)
    首项为T(1)+1 = 2,所以得通项公式为:
    T(n) + 1 = 2*2n-1 = 2n

    不过对于这类题还有一种更通用的公式很方便:

    对于这道题来说,c=1,b=2,g(n)=1,代入方程得:

    与前面做法得到得结果相同

    转载于:https://www.cnblogs.com/RB26DETT/p/11050055.html

    展开全文
  • 递归式求解学习笔记

    千次阅读 2018-07-14 21:25:56
    递归式求解 递归式求解主要有三种方法,分别是代入法、递归树法和主方法。递归式与分治方法紧密相连,因为使用递归式可以很自然地刻画分治算法的运行时间。换言之,对递归式进行求解有助于判断算法的优劣性,...

    递归式的求解

          递归式的求解主要有三种方法,分别是代入法、递归树法和主方法。递归式与分治方法紧密相连,因为使用递归式可以很自然地刻画分治算法的运行时间。换言之,对递归式进行求解有助于判断算法的优劣性,进而帮助我们选用更优的算法解决实际问题。


    一、代入法求解递归式 

          用代入法对递归式进行求解需要分两步进行:

          1. 猜测解的形式;

          2. 用数学归纳法求出解中的常数,并证明解是正确的。

          在猜测解的形式时,由于并不存在获得正确解的通用方法,因此这一步骤需要经验。一般而言,如果待求递归式的形式似曾相识,则猜测一个类似的解会是一种较便捷的方式。举例而言,假设已知递归式的解为,那么可以假设递归式的解也为,且使用代入法可证明该例子确实如此。除此之外,还有一种猜测方式是,首先证明递归式存在较为宽松的上界和下界,然后不断缩小范围。对于上述例子,可以从下界,上界开始,逐渐降低上界,提升下界,直到两者收敛,得到渐近界

     

    二、递归树法求解递归式

          递归树法也是求解递归式的一种方法。在递归树中,每一个节点表示一个单一子问题的代价,所谓子问题即算法中的递归函数调用。对递归树的每一层求和可以得到每一层的代价;对所有层求和便可以得到总的代价。举例而言,利用递归树法求解的递归式,该式对应的递归树如图1.1所示。

    图1.1  递归式的递归树,其高度为(有层)

          因为子问题的规模每一步均减少为上一步的1/4,因此最终必然会达到临界条件。由于深度为i的节点对应的子问题的规模为,因此递归树的层数为层。对于每一层的代价,当深度为i时,每一层的总代价为,另外树的最底层的总代价为,因此,对所有层数求和便可以得到整个递归树的总代价。

          根据上述思路,可以对递归树的所有层次的代价求和,来确定整棵树的代价:


    三、主方法求解递归式

          用主方法求解递归式依赖定理1。

          定理1:令是常数,f(n)是一个函数,T(n)是定义在非负整数上的递归式:

          其中我们将n/b解释为。那么T(n)有如下渐近界:

          1. 若对某个常数,则

          2. 若,则

        3. 若对某个常数,且对某个常数和所有足够大的n有,则

    展开全文
  • 递归式求解的三种方法

    万次阅读 2016-02-01 09:34:59
    算法设计经常用到递归,而递归式是比较好写的,也是容易反应算法的设计思路的,我们分析含递归算法的时间复杂度就要求解递归式。 下面介绍求解递归式的三种方法,以下方法参考《算法导论》,图片来自网络。 1.主...
  • 【递归】递归式求解

    2018-08-01 18:53:55
    首先介绍一些符号及其概念。 Θ:渐近紧确界 定义:Θ(g(n)) = { f(n):存在正常量c1,c2和n0,使得对所有n≥n0,有0 ≤ c1g(n) ≤ f(n) ≤ c2g(n)} 也就是说,当n超过某个值时,f(n)夹在c1g(n)...c2n^2,求解不等...
  • 这个递归式求解的通用主方法公式。此递归式描述的这样一种算法的运行时间:它将规模为 n 的问题分解为 a 个子问题,每个问题的规模是原问题的 1/b ,其中 a 和 b 都是 正常数 。 a 个子问题递归求解,每个子问题花费...
  • 用递归树方法求解递归式

    千次阅读 多人点赞 2019-11-26 21:50:38
    用递归树方法求解递归式 递归式:T(n)=3T(n/4)+Θ(n2)T\left(n\right)=3T\left(n/4\right)+Θ\left(n^2\right)T(n)=3T(n/4)+Θ(n2) 我们先来了解一下这个递归式什么意思: 333 表示我们将一个问题分解为333个子...
  • 递归式求解-主定理

    千次阅读 2017-03-15 13:39:43
    1.主定理:设a>=1和b>1为常数,设f(n)为一函数,T(n)由递归式对非负整数定义,其中n/b指下取整或上取整.那么T(n)可能有如下的渐进界: (1)若对于某常数 ε>0,有,则; (2)若.则; (3)若对于某常数 ε>0,有,且某常数 c与...
  • 递归算法的递归式及其求解方法

    万次阅读 2018-07-27 14:45:22
    但是如果在算法中存在递归的情况时我们发现很难写出这样的一个多项式用来准确描述问题规模与基本步骤的次数的关系,这时候,递归式就显得很有用处; 递归式,就是用来描述递归算法运行时间的一个等式或者不等式,它...
  • 求解递归式时间复杂度

    千次阅读 2020-03-06 20:52:57
    通过观察该递归式,注意到当n加倍时,输出增加4倍,于是猜测该递归式时间复杂度为O(n2),即T(n) = O(n2) 。 2、数学归纳法证明 我们用带常数系数的展开 T(k) ≤ c1k2-c2k(k<n) T(n) ≤4[c1(n/2)2-c2(n/2)]+n=...
  • [算法导论] 递归式求解的三种方法

    万次阅读 多人点赞 2014-08-25 14:18:25
    求解递归式,《算法导论》上给出了三种方法,不过对于
  • 求解递归式-主方法

    2019-09-27 11:47:35
    分治策略递归式时间复杂度的求解方法主要有三种:代入法、递归树和主方法。其中主方法为求解递归式T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f(n)提供了一种“菜谱”式的求解方法。 公式:T(n)=aT(n/b)+f(n)T...
  • 使用递归式求解算法时间复杂度

    千次阅读 2015-10-28 16:35:35
    使用递归式求解算法时间复杂度
  • 【算法导论】算法分析:递归式的三种求解方法 标签(空格分隔):【算法导论】 在分治策略中,为了确定算法的运行时间,需要求解递归式。 本文给出三种求解递归式的方法: 代入法:猜测一个界,然后使用数学归纳法...
  • 递归树法求解递归式

    千次阅读 2020-10-04 09:49:39
    递归算法时间复杂度的计算方程一个递归方程:    在引入递归树之前可以考虑一个例子:  T(n) = 2T(n/2) + n2  迭代2次可以得:  T(n) = n2+ 2(2T(n/4) + (n/2)2)  还可以继续迭代,将其完全展开可得:...
  • 数学归纳法证明,变量代换 递归树法
  • 分治 & 递归式求解

    千次阅读 2014-03-26 08:25:01
    当要求解的一个输入规模为n且取值又相当大的问题是,直接求解往往比较困难,有的甚至根本没法直接求出。正确的方法是,每当遇到这类问题时,首先应仔细分析问题本身所具有的特性,然后根据这些特性选择适当的设计...
  • 分治策略时间复杂度分析(二)-用递归树方法求解递归式 虽然可以用上一篇文章中的代入法去简洁地证明一个解确实是递归式的正确解,但是想出一个好的猜测可能会很困难。所以我们可以用递归树的方法去猜测解。 文章...
  • 算法导论 — 4.4 用递归树方法求解递归式

    千次阅读 多人点赞 2020-04-06 11:51:20
    在应用代入法求解递归式时,需要事先做出一个好的猜测。然而,有时候做出好的猜测是很困难的,此时可以考虑采用递归树方法。在递归树中,每个结点表示一个单一子问题的代价。创建递归树之后,对树的每层的各子问题的...
  • 递归求解递归方程

    千次阅读 2021-07-31 09:56:08
    首先了解一下这个递归式 T(n)=4T(n/2)+n 是什么意思: 4表示我们将一个问题分解为 4 个子问题 n/2表示每个子问题的规模是原问题的 1/2 n表示合并需要的额外计算时间 方法一可用主定理【Master定理】 主定理...
  • 算法学习之求解递归式~主定理 一、主定理定义 令a>=1和b>1是常数,f(n) 是一个函数,T(n) 是定义在非负整数上的递归式: T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n) 其中我们将n/b解释为 ⌊n/...
  • 人王营大BMDG 算法设计与分析 讲授内容:求解递归式 教师:胡学钢吴共庆 2014年11月13日 求解递归式 BMDC 合并排序的分析需要求解一个递归式 求解递归式就像求解积分,微分方程一样 学会一些技巧 递归式的应用 算法设计...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,049
精华内容 11,619
关键字:

递归式求解

友情链接: DAG中最长路径.zip