递归式求解

算法设计中经常会用到递归,利用递归式的方法可以清晰地显示算法的整个过程,而对于分析算法的复杂度,解递归式就有了用处,这里的方法来自于《算法导论》。

1. 代换法

代换法只能用于解那种很容易猜的情形,它可用来确定一个递归式的“O”和“Ω”界。

举例,确定递归式 T(n) = 2*T(└n/2┘) + n 的一个“O”界

1.1 先猜测有某个界存在

由于这个递归式与合并排序的计算时间复杂度的递归式很相似,所以我们猜测其解为 T(n) = O( n*log(n) )

1.2 然后用数学归纳法证明该猜测的正确性

要让猜测成立,我们需要证明 T(n) <= c*n*log(n),其中c是某个 >0 的常数。

先假设这个界对└n/2┘成立,即 T(└n/2┘) <= c*└n/2┘*log(└n/2┘)。

对递归式作替换:

T(n) = 2*T(└n/2┘) + n -> T(n) <= 2*(c*└n/2┘*log(└n/2┘)) + n    ->

T(n) <= c*n*log(└n/2┘) + n    ->    T(n) <= c*n*log(n) - c*n*log(2) + n    ->

T(n) <= c*n*log(n) - c*n + n -> T(n) <= c*n*log(n) +(1-c)*n

只要是c >= 1,有 T(n) <= c*n*log(n),所以就有: T(n) = O( n*log(n) )

接下来应用数学归纳法证明对边界条件也成立

注意对于此递归式,要将n=1的特殊情况,与n=2,3 ...等普遍情况分开。

2、 递归树

参考:http://blog.csdn.net/woniu317/article/details/22145047

例T(n) = 3T(n/4) + O(n2),其递归树如图3-1所示。图中结点中的数字表示合并问题解的代价,因此该递归式的解为图中所有结点中数字之和。易得该递归树最多有log4n+1层,如图中左侧所示;另外图右侧表明了每层的数字之和,则递归式T(n) = 3T(n/4) + O(n2)的解为T(n) = Ο(n2),详细结算过程如下:

3、 主方法

给出递归形式: T(n) = a * T(n/b) + f(n) 的界,其中a>=1,b>1,f(n)是给定的函数

这种方法要记忆三种情况,做到了这点,就可以很容易地确定很多简单的递归式的界了

递归式求解,布布扣,bubuko.com

时间: 2024-10-10 01:16:53

递归式求解的相关文章

分治策略(求解递归式的方法)

分解:将原问题划分成形式相同的子问题,规模可以不等,对半或2/3对1/3的划分. 解决:对于子问题的解决,很明显,采用的是递归求解的方式,如果子问题足够小了,就停止递归,直接求解. 合并:将子问题的解合并成原问题的解. 这里引出了一个如何求解子问题的问题,显然是采用递归调用栈的方式.因此,递归式与分治法是紧密相连的,使用递归式可以很自然地刻画分治法的运行时间.所以,如果你要问我分治与递归的关系,我会这样回答:分治依托于递归,分治是一种思想,而递归是一种手段,递归式可以刻画分治算法的时间复杂度.

递归式的三种求解方式

求解递归式对于分冶算法的重要性不言而喻 以下介绍了三种求解递归式的方法 1,代换法: 缺点:代换法主要的缺点在于,对于任何递归式,我们先得去猜其解,对于猜错了同学,如果不幸猜出的结果和正确结果相差太大,虽然可以推导,但是意义不大: 优点:代换法相较于递归树法更为严谨,相较于主定理应用范围更广,主定理只能求解类似于T(n) = aT(n/b)+n/c这种形式的递归式: 下面给出一个递归表达式T(n) = 2T(n/2)+n,求其解: 首先猜一下其解为O(nlgn);那么我们只需要证明T(n)<cn

【算法】2 由股票收益问题再看分治算法和递归式

回顾分治算法 分治算法的英文名叫做"divide and conquer",它的意思是将一块领土分解为若干块小部分,然后一块块的占领征服,让它们彼此异化.这就是英国人的军事策略,但我们今天要看的是算法. 如前所述,分治算法有3步,在上一篇中已有介绍,它们对应的英文名分别是:divide.conquer.combine. 接下来我们通过多个小算法来深化对分治算法的理解. 二分查找算法 问题描述:在已排序的数组A中查找是否存在数字n. 1)分:取得数组A中的中间数,并将其与n比较 2)治:

字符串匹配的双重递归式写法

字符串的匹配有很高效的KMP.Sunday等算法,可供使用.下面使用的匹配算法本质上是朴素的,但它的双重递归式的写法仍然值得借鉴. 完整示例代码 #include <stdio.h> #include <stdlib.h> #include <string.h> char *SubStrWithR(const char *str, const char *sub) { if (str == NULL || sub == NULL) return NULL; int fi

递归法求解汉罗塔hanoi问题

#include<iostream> using namespace std; //汉罗塔递归求解函数 从a移到c void move(int m,char a,char c); void hanoi(int n,char a,char b,char c) { if(1==n) { move(n,a,c); return; } hanoi(n-1,a,c,b); move(n,a,c); hanoi(n-1,b,a,c); } //将编号为m的圆盘从a移到c void move(int m,c

解递归式

一.代换法 1.    猜测结果 2.    用数学归纳法验证 3.    解出使解成立的常系数 ☆ 错误的例子: 证明 n = O(1): 基准情况 1 = O(1) 假设 n-1 = O(1) 则 n = (n-1)+1 = O(1) 错误!因为不能对大O符号进行归纳,每一处的 O(1) 的常数是变化的. 如果对有限个 O(1) 加倍是没问题的,但进行 n 次加倍就不对了, 此时常数是依赖于 n 变化的. ☆ 例:T(n) = 4T(n/2) + n 基准情况:T(1) = Θ(1) ① 

Windows C++ 非递归式(stack)深度优先遍历目录

1 #include <Windows.h> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <stack> 6 7 typedef void (__stdcall *P_WALK_DIR_CALLBACK)(const std::string &In_strFilePath); 8 9 int WalkDir(const char *In_p

五边形数和两个递归式

五边形数 五边形数是对每条边上有 \(n\) 个点构成的五边形的总点数的数列的称呼. 由上图,可以得出这个数列的递归式. \[ \begin{aligned} a_1&=1 \a_n&=a_{n-1}+(3n-2) \\end{aligned} \] 解递归式得到通项公式 \[ \begin{aligned} a_n&=\sum _{i=1}^n(3i-2)=\frac{n(3n-1)}{2} \end{aligned} \] 它也能通过三个三角形数得到. 狭义的五边形数中 \(n

Python算法教程第三章知识点:求和式、递归式、侏儒排序法和并归排序法

本文目录:一.求和式:二.递归式:三.侏儒排序法和并归排序法微信公众号:geekkr</br></br></br> 一.求和式 # 假设有一函数为f(),则在Python中经常使用的求和方法如下. sum(f(i) for i in range(m, n+1)) + sum(g(i) for i in range(m, n+1)) sum(f(i)+g(i) for i in range(m, n+1)) </br>二.递归式 # 举个栗子 def S(se