算法设计与分析-第2章 递推方程求解
算法设计与分析第2章
计算F(n-1)所需 乘法次数 计算F(n-1) ×n所需 乘法次数
初始条件(initial condition):停止递归调用的条件 T(0) = 0
• Conquer: 一个划分确定后,A[s]的位置便确定,再 对两个子数组递归地划分 • Combine: 原地排序in-place sort,无需合并
Quicksort(A[l…r]) if l < r s = Partition(A[l…r]) Quicksort(A[l…s-1]) Quicksort(A[s+1…r]) Partition(A[l…r]) p = A[l] //选择第一个元素作为划分基准 i = l; j = r + 1 repeat repeat i = i + 1 until A[i] ≥ p //left-to-right scan repeat j = j - 1 until A[j] ≤ p //right-to-left scan swap(A[i], A[j]) until i ≥ j swap(A[i], A[j]) //undo last swap when i ≥ j swap(A[l], A[j]) return j
二分搜索(Binary Search)
• 给定已按升序排好序的n个元素A[0…n-1],现要在 这n个元素中找出一特定元素k。
– 蛮力算法:遍历、 Tworst(n) =O(n) – 分治法是否适用?
• • • •
求解递推方程
求解递推方程递推方程是一种数学模型,用于描述某个数列中每个数与前面的数之间的关系。
在实际应用中,递推方程常常用于预测未来的趋势或者计算某个数列中的特定项。
本文将介绍如何求解递推方程。
我们需要了解递推方程的基本形式。
一般来说,递推方程可以写成如下形式:an = f(an-1, an-2, …, an-k)其中,an表示数列中的第n项,f是一个函数,它描述了第n项与前面的k项之间的关系。
在实际应用中,k的取值通常是2或3。
接下来,我们需要找到递推方程的初始条件。
也就是说,我们需要知道数列中的前k项。
这些初始条件通常是通过实验或者观察得到的。
有了递推方程和初始条件,我们就可以使用递推法求解数列中的任意一项。
具体来说,我们可以按照如下步骤进行:1. 根据初始条件,计算出数列中的前k项。
2. 根据递推方程,计算出数列中的第k+1项。
3. 用计算出的第k+1项替换掉数列中的第1项,得到新的数列。
4. 重复步骤2和步骤3,直到计算出所需的项数为止。
需要注意的是,递推方程的求解过程中可能会涉及到复杂的数学运算,例如求和、求积等。
在这种情况下,我们可以使用数学工具或者编程语言来辅助计算。
我们需要检验所求解的数列是否符合递推方程和初始条件。
一般来说,我们可以通过计算数列中的前几项来检验结果的正确性。
如果计算出的数列与实际数列相符,则说明递推方程求解正确。
求解递推方程是一种重要的数学技能,它在实际应用中具有广泛的应用。
通过掌握递推方程的基本形式和求解方法,我们可以更好地理解数列中的规律,预测未来的趋势,以及计算数列中的特定项。
算法设计与分析耿国华第二章
Chapter
Hale Waihona Puke 22.4.1替换方法
例2.6 汉诺塔算法(见例2.5)的时间复杂 度分析。 假设汉诺塔算法的时间复杂度为T(n),例 2.5的算法递归方程为:
n 1 1 T ( n) 2T (n 1) 1 n 1
Chapter
2
2.4.1替换方法
利用替换法求解该方程:
T (n) 2T (n 1) 1
2
2.2具有递归特性的问题
• (2)递归定义的数据结构
在数据结构中,如广义表、二叉树、树等结构 其本身均具有固有的递归特性,可以自然地采 用递归法进行处理。 (3)递归求解方法 许多问题的求解过程可以用递归分解的方法描 述,例如:计算两非负整数最大公约数的欧几 里得算法和著名的汉诺塔问题(Hanoi)问题。
T (n) O(2n )
得到该算法的时间复杂度
Chapter
2
2.4.1替换方法
例2.7 2-路归并排序的递归算法分析。 假设初始序列含有n个记录,首先将这n个记 录看成n个有序的子序列,每个子序列的长度为1, 然后两两归并,得到 n / 2个长度为2(n为奇数 时,最后一个序列的长度为1)的有序子序列; 在此基础上,再对长度为2的有序子序列进行两 两归并,得到若干个长度为4的有序子序列;如 此重复,直至得到一个长度为n的有序序列为止。 这种方法被称作2-路归并排序。
F(6) F(5) F(4) F(3) F(2) F(1) F(0) F(1) F(1) F(2) F(3) F(2) F(1) F(2) F(1) F(0) F(3) F(1) F(1) F(4) F(2) F(0)
F(0) F(1) F(0)
图2-1 斐波那契算法的递归结构(n=6)
[工学]算法设计与分析第二章
递归复杂性的一般形式
• 一般的,递归复杂性可描述为递归方程: 1 n=1 f(n) = af(n ~ b) + D(n) n>1 • 其中,a是子问题个数, ~表示递减方式, b是递减步长, D(n)是合成子问题的开销。 • 通常,递归元的递减方式~有两种: 分治法 1、除法,即n / b,的形式; 递推法 2、减法,即n – b,的形式。
第二章
递归与分治
2018/11/20
计算机算法设计与分析
1
递归的思想
• 递归(Recursion)就是通过把复杂问题分解为 较简单的同一问题来求解。 • 递归求解问题的方法通常有两步: • 第一步是考虑最简单的情况下该问题如何 求解。 • 第二步是考虑该问题的较复杂情况是如何 由较简单的所构成的。 • 由此得出该问题求解的方法。
2018/11/20 计算机算法设计与分析 28
分治法的基本思想
• 将一个规模为n的问题分解为a个规模较小的 子问题,这些子问题互相独立并且与原问题 相同。 • 递归地求解这些子问题问题。 • 然后将各个子问题的解合并在一起,从而得 到原问题的解。 • 影响其时间复杂性的因素是子问题的个数和 合并开销函数,其中较大者起主要作用。
A B C
2018/11/20
计算机算法设计与分析
4
Hanoi塔问题
• 让我们先考虑最简单的情况: • 1、若没有盘子(n=0),自然不需要做任何事情。 • 2、若只有一个盘子,也很容易。直接把它移到B 盘即可。
• 不妨设操作Move(X, Y) 将X柱上的一个盘子(最 顶上的)移到Y柱上。
A B C
GCD(x, y) = y, x, GCD(x – y, y), GCD(x, y – x), x=0 y = 0 最简单 x y 的情况 x < y 有两种
求解递推方程
求解递推方程【前言】递推方程,在数学中也称为递归式,是一种递归定义的数学式子。
它通常用于描述一些指数级别的计算过程,如斐波那契数列等,是算法分析中一个非常基础的概念。
本文将介绍递推方程的基本概念和求解方法,并给出几个例子进行解析。
另外,本文的内容长度约为700字,将按照以下列表划分:1.递推方程的定义2.递推方程的求解方法3.斐波那契数列的递推方程4.经典递推问题——青蛙跳台阶问题的递推方程5.总结【正文】1.递推方程的定义递推方程是描述一个数列中每个项与前面某些项之间关系的方程式。
通常用f(n)表示序列的第n个数,而序列中的每个数,都可以通过前面某几个数的加减乘除运算来得到。
递推方程可以用以下的方式表示:f(n)=a*f(n-1) + b*f(n-2) + g(n)其中a,b为常数,g(n)是一个能够用n的式子表示的函数。
2.递推方程的求解方法对于递推式的求解,通常需要用到数学归纳法。
具体来说,可以采用以下的步骤:(1)通过观察数列的前几个数,找出递推式的初值。
(2)首先验证初值是否符合递推式,即检验f(1),f(2)等初几项是否为预期的值。
(3)假定递推式对1到n-1的所有自然数都成立,需要证明递推式对n也成立,即验证f(n)是否能够通过前面的项f(1)~f(n-1)计算得到。
(4)最后,通过归纳法证明递推式对任意自然数n都成立。
3.斐波那契数列的递推方程斐波那契数列是一个非常经典的递推问题,定义如下:f(1)=1,f(2)=1f(n)=f(n-1)+f(n-2),n≥3其中,f(n)表示斐波那契数列的第n项。
这个数列的前几项依次为1,1,2,3,5,8,13,21......以下是斐波那契数列的递推方程的证明过程:(1)首先根据题意,可以确定斐波那契数列的初值f(1)=1,f(2)=1。
(2)验证初值是否符合递推式,可以计算出f(3)=2,f(4)=3等,并确认这些值与数列的定义是一致的。
算法设计与分析(第2版)
出版工作
2018年8月1日,该教材由清华大学出版社出版。
内容简介
内容简介
全书由12章构成,各章的内容如下。
第1章概论:介绍算法的概念、算法分析方法和STL在算法设计中的应用。
教材目录
教材目录
(注:目录排版顺序为从左列至右列 )
教学资源
教学资源
该教材配有配套教材——《算法设计与分析(第2版)学习与实验指导》,该配套教材涵盖所有练习题、上 机实验题和在线编程题的参考答案。
该教材每个知识点都配套了视频讲解,提供PPT课件、源码、答案、教学大纲、题库、书中全部源程序代码 (在VC++6.0中调试通过)等教学资源。
算法设计与分析(第2版)
20xx年清华大学出版社出版的图书
01 成书过程
03 教材目录源 06 作者简介
基本信息
《算法设计与分析(第2版)》是由李春葆主编,2018年清华大学出版社出版的高等学校数据结构课程系列 教材。该教材适合作为高等院校“算法设计与分析”课程的教材,也可供ACM和各类程序设计竞赛者参考。
第5章回溯法:介绍解空间概念和回溯法算法框架,讨论采用回溯法求解0/1背包问题、装载问题、子集和问 题、n皇后问题、图的m着色问题、任务分配问题、活动安排问题和流水作业调度问题的典型算法。
第6章分枝限界法:介绍分枝限界法的特点和算法框架、队列式分枝限界法和优先队列式分枝限界法,讨论 采用分枝限界法求解0/1背包问题、图的单源最短路径、任务分配问题和流水作业调度问题的典型算法。
该教材介绍了各种常用的算法设计策略,包括递归、分治法、蛮力法、回溯法、分枝限界法、贪心法、动态 规划、概率算法和近似算法等,并讨论了各种图算法和计算几何设计算法。书中配有图表、练习题、上机实验题 和在线编程题。
算法之2章递归与分治
算法分析(第二章):递归与分治法一、递归的概念知识再现:等比数列求和公式:1、定义:直接或间接地调用自身的算法称为递归算法。
用函数自身给出定义的函数称为递归函数。
2、与分治法的关系:由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
这自然导致递归过程的产生。
分治与递归经常同时应用在算法设计之中,并由此产生许多高效算法。
3、递推方程:(1)定义:设序列01,....na a a简记为{na},把n a与某些个()ia i n<联系起来的等式叫做关于该序列的递推方程。
(2)求解:给定关于序列{n a}的递推方程和若干初值,计算n a。
4、应用:阶乘函数、Fibonacci数列、Hanoi塔问题、插入排序5、优缺点:优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。
缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。
二、递归算法改进:1、迭代法:(1)不断用递推方程的右部替代左部(2)每一次替换,随着n的降低在和式中多出一项(3)直到出现初值以后停止迭代(4)将初值代入并对和式求和(5)可用数学归纳法验证解的正确性2、举例:-----------Hanoi塔算法----------- ---------------插入排序算法----------- ()2(1)1(1)1T n T nT=−+=()(1)1W n W n nW=−+−(1)=021n-23()2(1)12[2(2)1]12(2)21...2++2 (121)n n n T n T n T n T n T −−=−+=−++=−++==++=−(1)2 ()(1)1((n-2)+11)1(2)(2)(1)...(1)12...(2)(1)(1)/2W n W n n W n n W n n n W n n n n =−+−=−−+−=−+−+−==++++−+−=−3、换元迭代:(1)将对n 的递推式换成对其他变元k 的递推式 (2)对k 进行迭代(3)将解(关于k 的函数)转换成关于n 的函数4、举例:---------------二分归并排序---------------()2(/2)1W n W n n W =+−(1)=0(1)换元:假设2kn =,递推方程如下()2(/2)1W n W n n W =+−(1)=0 → 1(2)2(2)21k k k W W W−=+−(0)=0(2)迭代求解:12122222321332133212()2(2)212(2(2)21)212(2)22212(2)2*2212(2(2)21)2212(2)222212(2)3*2221...2(0)*2(22...21)22k k k k k k k k k k k k k k k k k k k k k k k k W n W W W W W W W W k k −−−−−−−+−+−−−=+−=+−+−=+−+−=+−−=+−+−−=+−+−−=+−−−==+−++++=−1log 1n n n +=−+(3)解的正确性—归纳验证: 证明递推方程的解是()(1)/2W n n n =−()(1)1W n W n n W =−+−(1)=0,(n 1)=n +n=n(n-1)/2+n =n[(n-1)/2+1]=n(n+1)/2n W W +方法:数学归纳法证 n=1,W(1)=1*(1-1)/2=0假设对于解满足方程,则()---------------快速排序--------------------->>>平均工作量:假设首元素排好序在每个位置是等概率的112()()()(1)0n i T n T i O n n T −==+=∑ >>>对于高阶方程应该先化简,然后迭代(1)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。
计算机算法设计与分析(第4版) 王晓东习题解答
第一章作业1.证明下列Ο、Ω和Θ的性质1)f=Ο(g)当且仅当g=Ω(f)证明:充分性。
若f=Ο(g),则必然存在常数c1>0和n0,使得∀n≥n0,有f≤c1*g(n)。
由于c1≠0,故g(n) ≥ 1/ c1 *f(n),故g=Ω(f)。
必要性。
同理,若g=Ω(f),则必然存在c2>0和n0,使得∀n≥n0,有g(n) ≥ c2 *f(n).由于c2≠0,故f(n) ≤ 1/ c2*f(n),故f=Ο(g)。
2)若f=Θ(g)则g=Θ(f)证明:若f=Θ(g),则必然存在常数c1>0,c2>0和n0,使得∀n≥n0,有c1*g(n) ≤f(n) ≤ c2*g(n)。
由于c1≠0,c2≠0,f(n) ≥c1*g(n)可得g(n) ≤ 1/c1*f(n),同时,f(n) ≤c2*g(n),有g(n) ≥ 1/c2*f(n),即1/c2*f(n) ≤g(n) ≤ 1/c1*f(n),故g=Θ(f)。
3)Ο(f+g)= Ο(max(f,g)),对于Ω和Θ同样成立。
证明:设F(n)= Ο(f+g),则存在c1>0,和n1,使得∀n≥n1,有F(n) ≤ c1 (f(n)+g(n))= c1 f(n) + c1g(n)≤ c1*max{f,g}+ c1*max{f,g}=2 c1*max{f,g}所以,F(n)=Ο(max(f,g)),即Ο(f+g)= Ο(max(f,g))对于Ω和Θ同理证明可以成立。
4)log(n!)= Θ(nlogn)证明:∙由于log(n!)=∑=n i i 1log ≤∑=ni n 1log =nlogn ,所以可得log(n!)= Ο(nlogn)。
∙由于对所有的偶数n 有,log(n!)= ∑=n i i 1log ≥∑=n n i i 2/log ≥∑=nn i n 2/2/log ≥(n/2)log(n/2)=(nlogn)/2-n/2。
当n ≥4,(nlogn)/2-n/2≥(nlogn)/4,故可得∀n ≥4,log(n!) ≥(nlogn)/4,即log(n!)= Ω(nlogn)。
第二讲递推公式求解
第二讲递推公式求解
递推公式是求解递归问题的一种方法,它可以用简单的表达式描述系
统的行为,以确定或猜测系统未来的行为。
在数学上,它是一个表达式,
可以将系统的当前状态用于计算下一状态的值,并将其用于下一步的计算。
递推公式一般有两种形式,即线性递推公式和非线性递推公式。
线性递推公式是指当n(当前状态)变化时,其结果也是线性的,即
其中的变量与n的关系可以表示为一个线性的方程式。
线性递推公式可以
用于求解递归问题。
例如,求解有线性递推公式的递归问题:F(n)=F(n-1)+F(n-2)。
非线性递推公式是指当n(当前状态)变化时,其结果是非线性的,
即其中的变量与n的关系不能表示为一个线性方程式。
非线性递推公式可
以用于求解递归问题,例如,求解非线性递推公式的递归问题:
F(n)=F(n-1)×F(n-2)。
在许多情况下,线性递推公式可以用来求解递归问题,而非线性递推
公式要更加复杂,但它们可以用来求解一些比较复杂的递推问题。
求解递推公式的一般步骤如下:
(1)找出递推公式,并得到它的形式;
(2)如果是线性递推,解出其特征方程;
(3)根据特征方程和起始条件确定递推公式的解;。
黄宇《算法设计与分析》课后习题解析(二)精选全文
黄宇《算法设计与分析》课后习题解析(⼆)第2章:从算法的视⾓重新审视数学的概念2.1:(向下取整)题⽬:请计算满⾜下⾯两个条件的实数的区间解析:根据向下取整的含义,令,讨论a的取值范围即可解答:令,则可得:即:故的取值区间为:2.2: (取整函数)题⽬:证明:对于任意整数,(提⽰:将n划分为)。
解析:根据提⽰将n进⾏划分,根据取整函数的定义⽤k表⽰取整函数,即可证明;证明如下:因为对于任意整数,可划分为,则:① ;② ;综上:对于任意整数,, 得证;2.3: (斐波拉契数列)对于斐波拉契数列,请证明:1)题⽬:是偶数当且仅当n能被3整除解析:由斐波拉契数列的递归定义式,容易联想到数学归纳法;证明如下:(采⽤数学归纳法)i)当n = 1,2,3时,依次为1,1,2,符合命题;ii)假设当(k>=1)时命题均成⽴,则:① 当n = 3k+1时,是奇数,成⽴;② 当n = 3k+2时,是奇数,成⽴;③ 当 n = 3(k+1)时,是偶数,成⽴;综上:归纳可得为偶数当且仅当,得证;2)题⽬:x x =1+a (0<a <1)x =1+a (0<a <1)⌊x ⌋=1⇒⌊x ⌋=21⌊x ⌋=2⌊1+a +22a ⌋=1a +22a <1⇒0<a <−21⇒1<a +1<⇒21<x <2x (1,)2n ≥1⌈log (n +1)⌉=⌊logn ⌋+12≤k n ≤2−k +11n ≥12≤k n ≤2−k +11k +1=⌈log (2+k 1)⌉≤⌈log (n +1)⌉≤⌈log (2)⌉=k +1k +1=>⌈log (n +1)⌉=k +1k =⌊log (2)⌋≤k ⌊logn ⌋≤⌊log (2−k +11)⌋=k =>⌊logn ⌋=k n ≥1⌈log (n +1)⌉=k +1=⌊logn ⌋+1F n F n n ≤3k F =n F +n −1F =n −2F +3k F =3k −1>F 3k +1F =n F +3k +1F =3k >F 3k +2F =n F +3k +2F =3k +1>F 3k +3F n 3∣n F −n 2F F =n +1n −1(−1)n +1解析:同1)理,容易联想到数学归纳法证明如下:(采⽤数学归纳法)i)当n = 2时,, 易知成⽴;ii)假设当 n = k 时命题成⽴,① 若k = 2m, 则,当n = k+1 = 2m+1时,要证命题成⽴,即证: => ,代⼊递推式, 得:, 易知是恒等式,故命题成⽴;②当 k=2m+1时,同①理可证命题成⽴;综上:归纳可得,得证;2.4:(完美⼆叉树)给定⼀棵完美⼆叉树,记其节点数为,⾼度为,叶节点数为,内部节点数为1)题⽬:给定上述4个量中的任意⼀个,请推导出其他3个量解析:根据完美⼆叉树的结构特点易得解答:(仅以已知⾼度h推导其他三个量为例,其余同理)已知⾼度为h,可得:节点数:叶节点数:内部节点数:2)题⽬:请计算完美⼆叉树任意⼀层的节点个数:① 如果任意指定深度为的⼀层节点,请计算该层节点个数;② 如果任意指定⾼度为的⼀层节点,请计算该层节点个数;解析:根据完美⼆叉树的结构特点易得(注意节点深度和节点⾼度是互补的,相加为树⾼)解答:① ; ② ;2.5: (⼆叉树的性质)对于⼀棵⾮空的⼆叉树T,记其中叶节点的个数为,有1个⼦节点的节点个数为,有两个⼦节点的节点个数为1)题⽬:如果T是⼀棵2-tree,请证明。
算法设计与分析讲义chapter2
第二章算法分析得数学基础outline1 算法复杂性得阶2与式得估计与界限3递归方程4 集合、关系、函数、图、树等5 计数原理与概率论2、1 复杂性函数得阶2、1、1同阶函数集合定义2、1、1(同阶函数集合)、θ(f(n))={g(n)|∃c1,c2>0,n0,当n≥ n0,c1f(n)≤g(n)≤c2f(n)}称为与f(n)同阶得函数集合。
*如果g(n)∈θ(f(n)),我们称个g(n)与f(n)同阶。
*g(n)∈θ(f(n))常记作g(n)=θ(f(n))。
*f(n)必须就是极限非负得,即当n充分大以后,f(n)就是非负得,否则=空集。
例1 证明证、设 ,令c1=a/4,c2=7a/4,则,令。
当时成立。
例2 证明证、如果存在c1、c2>0,n0使得当n≥n0时,c1≤6n3≤c2n2。
于就是,当n>c2/6时,n≤c2/6,矛盾。
例3例4 因任何常数,,如果令。
2、1、2 低阶函数集合定义2、1、2(低阶函数集合)、O(f(n))={g(n)|∃c>0,n0 ,当n≥ n0 ,0≤g(n)≤cf(n)}称为比f(n)低阶得函数集合。
*如果g(n)∈O(f(n)),称f(n)就是g(n)得上界。
*g(n)∈O(f(n))常记作g(n)=O(f(n))。
例1例2 证明。
证、令c=1,n0=1,则当时,。
2、1、3 高阶函数集合定义2、1、3(高阶函数集合)、Ω(f(n))={g(n)|∃c>0,n0 ,当n≥n0 ,0≤cf(n)≤g(n)}称为比f(n)高阶得函数集合。
*如果g(n)∈Ω(f(n)),称f(n)就是g(n)得下界。
*g(n)∈Ω(f(n))常记作g(n)=Ω(f(n))。
定理2、1、对于任意f(n)与g(n), iff 而且f(n)=Ω(g(n))、证、如果, 则当时,、显然、如果且,则由可知,存在使得,当,。
由f(n)=Ω(g(n))可知,使得当,令,则当,。
算法设计与分析:第02章 递归与分治策略
A(1,0) 2 A(0, m) 1 m0 A(n,0) n 2 n2 A(n, m) A( A(n 1, m), m 1) n, m 1
2.1
递归的概念
例3 Ackerman函数 前2例中的函数都可以找到相应的非递归方式定义:
n! 1 2 3 (n 1) n
课件第2章
递归与分治策略
算法总体思想
• 将要求解的较大规模的问题分割成k个更小规模的子问 对这k个子问题分别求解。如果子问题的规模仍然不够 小,则再划分为k个子问题,如此递归的进行下去,直 题。 到问题规模足够小,很容易求出其解为止。
T(n)
=
n
T(n/2)
T(n/2)
T(n/2)
T(n/2)
算法总体思想
下面来看几个实例。
2.1
递归的概念
边界条件
例1 阶乘函数 阶乘函数可递归地定义为:
n0 1 n! n(n 1)! n 0
递归方程 边界条件与递归方程是递归函数的二个要素,递归函 数只有具备了这两个要素,才能在有限次计算后得出 结果。
2.1
递归的概念
例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,…,被 称为Fibonacci数列。它可以递归地定义为:
2.1
递归的概念
例6 Hanoi塔问题 public static void hanoi(int n, int a, int b, int c) 当n=1时,问题比较简单。此时,只要将编号为1的圆盘从塔座a直 在问题规模较大时,较难找到一般的方法,因此我们尝试 接移至塔座b上即可。 用递归技术来解决这个问题。 { 思考题:如果塔的个数变为a,b,c,d 当n>1时,需要利用塔座c作为辅助塔座。此时若能设法将n-1个 if (n > 0) 四个,现要将n个圆盘从a全部移动 较小的圆盘依照移动规则从塔座a移至塔座c,然后,将剩下的最 { 到d,移动规则不变,求移动步数最 大圆盘从塔座a移至塔座b,最后,再设法将n-1个较小的圆盘依照 hanoi(n-1, a, c, b); 小的方案。 移动规则从塔座c移至塔座b。 move(a,b); 由此可见,n个圆盘的移动问题可分为2次n-1个圆盘的移动问题, hanoi(n-1, c, b, a); 这又可以递归地用上述方法来做。由此可以设计出解Hanoi塔问题 的递归算法如下。 } }
第二讲 递推公式求解
…
nlogb a
主定理法 例题 1
30
主定理法 例题 2
31
主定理法 例题 3
32
主定理法 例题 4
主方法不适用 对于任意 ε > 0,nε = ω(logn)
33
主定理法 练习
• 题目 4-1: 递归式例题 a) T(n) = 2T(n/2) + n3 T(n) = Θ(n3) Case 3 b) T(n) = T(9n/10) + n T(n) = Θ(n) Case 3 c) T(n) = 16T(n/4) + n2 T(n) = Θ(n2logn) Case 2
…
Θ(1)
17
T(n) = T(n/4) + T(n/2) + n2
n2
n2
(n/4)2
(n/2)2
(5/16)n2
(n/16)2 (n/8)2 (n/8)2 (n/4)2 (25/256)n2
… Θ(1)
…
T(n) = n2(1+5/16+(5/16)2+…) = Θ(n2)
18
代入法证明T(n) = T(n/4) + T(n/2) + n2 = Θ(n2)
9
例:T(n)=2T(√n)+logn
• 通过改变变量转化递归式,将√n转化为整 数。令m = logn,于是 T(2m) = 2T(2m/2) + m
• 再令S(m) = T(2m),于是 S(m) = 2S(m/2) + m = Θ(mlogm) T(n) = T(2m) = S(m) = Θ(mlogm) = Θ(logn loglogn)
断A中缺的数大于等于 2⌊logn-1⌋ ,还是小于之 – 继续判断包含缺失数的那部分数的下一位,可以再次
计算机算法设计与分析(第4版) 王晓东习题解答
第一章作业1.证明下列Ο、Ω和Θ的性质1)f=Ο(g)当且仅当g=Ω(f)证明:充分性。
若f=Ο(g),则必然存在常数c1>0和n0,使得∀n≥n0,有f≤c1*g(n)。
由于c1≠0,故g(n) ≥ 1/ c1 *f(n),故g=Ω(f)。
必要性。
同理,若g=Ω(f),则必然存在c2>0和n0,使得∀n≥n0,有g(n) ≥ c2 *f(n).由于c2≠0,故f(n) ≤ 1/ c2*f(n),故f=Ο(g)。
2)若f=Θ(g)则g=Θ(f)证明:若f=Θ(g),则必然存在常数c1>0,c2>0和n0,使得∀n≥n0,有c1*g(n) ≤f(n) ≤ c2*g(n)。
由于c1≠0,c2≠0,f(n) ≥c1*g(n)可得g(n) ≤ 1/c1*f(n),同时,f(n) ≤c2*g(n),有g(n) ≥ 1/c2*f(n),即1/c2*f(n) ≤g(n) ≤ 1/c1*f(n),故g=Θ(f)。
3)Ο(f+g)= Ο(max(f,g)),对于Ω和Θ同样成立。
证明:设F(n)= Ο(f+g),则存在c1>0,和n1,使得∀n≥n1,有F(n) ≤ c1 (f(n)+g(n))= c1 f(n) + c1g(n)≤ c1*max{f,g}+ c1*max{f,g}=2 c1*max{f,g}所以,F(n)=Ο(max(f,g)),即Ο(f+g)= Ο(max(f,g))对于Ω和Θ同理证明可以成立。
4)log(n!)= Θ(nlogn)证明:∙由于log(n!)=∑=n i i 1log ≤∑=ni n 1log =nlogn ,所以可得log(n!)= Ο(nlogn)。
∙由于对所有的偶数n 有,log(n!)= ∑=n i i 1log ≥∑=n n i i 2/log ≥∑=nn i n 2/2/log ≥(n/2)log(n/2)=(nlogn)/2-n/2。
当n ≥4,(nlogn)/2-n/2≥(nlogn)/4,故可得∀n ≥4,log(n!) ≥(nlogn)/4,即log(n!)= Ω(nlogn)。
算法分析基础——迭代法求解递推方程
算法分析基础——迭代法求解递推⽅程迭代法的步骤:迭代⽤递推⽅程的右部替换左部出现初始值时,迭代停⽌⽤数学归纳法验证解的正确性例如,Hanoi塔问题是⼀个可以递归求解的经典问题。
我们便可以⽤迭代法求解其时间复杂度的递推⽅程。
⾸先看⼀下Hanoi塔问题的算法伪码:算法1 Hanoi(A, C, n) //将A柱上n个盘⼦按照要求移到C柱上1. if n=1 then move (A, C) //将A柱上1个盘⼦移到C柱上2. else Hanoi(A, B, n-1)3. move (A, C)4. Hanoi(B, C, n-1)设移动n个盘⼦的所需要的移动次数为T(n),由算法的伪码得到递推⽅程T(n) = 2 * T(n-1) + 1 = 2 * [T(n-2) + 1] + 1 = ... = 2n-1 * T(1) + 2n-2 + ... + 2 + 1,其中T(1) = 1。
于是得到T(n) = 2n - 1。
再⽤数学归纳法带⼊验证结果:T(n) = 2 * T(n - 1) + 1 = 2 * (2n - 1 - 1) + 1 = 2n - 1。
随着n的增⼤,算法的时间复杂度呈指数级别增长,解Hanoi问题需要的时间之漫长将令⼈难以接受。
事实上,Hanoi塔问题属于NP-Hard问题,即不存在多项式级别时间复杂度的解法,是不可解的。
有时,当直接只⽤迭代法解递归⽅程⽐较复杂时,可以采⽤换元迭代的⽅法,其执⾏步骤总结如下:将对n的递推式换成对其它变元k的递推式对k直接迭代将解(关于k的函数)转换成关于n的函数例如,考虑归并排序的时间复杂度。
设待排序数组A的长度为n。
⾸先看⼀下伪码:算法2 MergeSort(A, p, r)输⼊: 数组A[p...r], 1 ≤ p ≤ r ≤ n输出: 从A[p]到A[r]按照递增顺序排好的数组A1. if p < r2. then q←floor((p+r)/2)3. MergeSort(A, p, q)4. MergeSort(A, q+1, r)5. Merge(A, p, q, r)设W(n)为对长度为n的数组排序需要的⽐较次数。
算法设计与分析-主定理
算法设计与分析-主定理主定理的作⽤:求解递推⽅程。
使⽤主定理,就可以不⽤迭代法。
条件:得判断是否满⾜3个条件中的⼀个。
T(n)=aT(n/b)+f(n)n:解的规模a:⼦问题的个数n/b:归约后⼦问题的规模f(n):除了⼦问题,要求解另外增加的计算代价,不参加递归。
定理:设a>=1,b>=1,为常数,f(n)为函数,T(n)为⾮负整数,且T(n)=aT(n/b)+f(n),则有3个条件:下⾯是主定理的三⼤条件:1.f(n)=O(n log b a-ε)存在ε>0,就是当n log b a的阶⾼于f(n)时,可以存在ε使得n log b a-ε和f(n)的阶相同。
此时取T(n)=θ(n log b a)。
2.f(n)=Θ(n log b a)注意这时n log b a的阶和f(n)的阶相同,不需要ε。
此时取T(n)=Θ(n log b a logn)。
3.f(n)=Ω(n log b a+ε)⾸先得存在ε>0,就是当n log b a的阶低于f(n)时,可以存在ε使得n log b a+ε和f(n)的阶相同。
第⼆个要满⾜的条件是:af(n/b)<=cf(n), c<1。
此时取T(n)=Θ(f(n))。
来⼏道例题:例⼀:求解递推⽅程T(n)=9T(n/3)+n。
a=9,b=3,f(n)=n。
先判断n log b a=n log39=n2,阶数⾼于n,存在f(n)=O(n log b a-ε)=O(n2-1),ε=1。
满⾜主定理的条件1,所以T(n)=Θ(n log b a)=Θ(n2)。
例⼆:求解递推⽅程T(n)=T(2n/3)+1。
a=1,b=3/2,f(n)=1。
先判断n log b a=n log3/21=n0=1,和f(n)同阶。
满⾜主定理的条件2,所以T(n)=Θ(n log b a logn)=Θ(logn)。
例三:求解递推⽅程T(n)=3T(n/4)+nlogn。
求解递推方程
求解递推方程递推方程是一种描述数列或函数的方法,通过给定初始条件和递推关系,可以求解出数列或函数的各个值。
在数学和计算机科学中,递推方程被广泛应用于各种问题的求解,例如斐波那契数列、阶乘计算等。
我们需要明确递推方程的定义和求解方法。
递推方程是一种通过给定初始条件和递推关系来确定数列或函数值的方法。
其中,初始条件指的是已知的数列或函数的前几个值,递推关系则是通过已知的数列或函数值来计算下一个值的关系式。
对于递推方程的求解,主要有两种方法:直接法和递归法。
直接法是通过递推关系式直接计算出所需的数列或函数值,而递归法则是通过递推关系式和已知的初始条件来递归地计算出所需的数列或函数值。
以斐波那契数列为例,其递推方程为f(n) = f(n-1) + f(n-2),其中f(0) = 0,f(1) = 1。
根据这个递推方程和初始条件,我们可以使用直接法或递归法来求解斐波那契数列的任意项。
使用直接法求解斐波那契数列的思路是,从初始条件开始,通过递推关系式依次计算出每一项的值,直到计算到所需的项。
具体步骤如下:1. 根据初始条件,将f(0)和f(1)分别设为0和1;2. 根据递推关系式f(n) = f(n-1) + f(n-2),计算出f(2)、f(3)、f(4)等项的值;3. 重复上述计算,直到计算到所需的项。
使用递归法求解斐波那契数列的思路是,根据递推关系式和初始条件,通过递归地调用自身来计算出每一项的值。
具体步骤如下:1. 定义一个递归函数fib(n),用于计算斐波那契数列的第n项的值;2. 在递归函数中,首先判断n的值是否满足初始条件,如果满足则直接返回初始值;3. 如果n不满足初始条件,则通过递归调用fib(n-1)和fib(n-2)来计算出f(n)的值;4. 递归调用结束后,将计算结果返回。
除了斐波那契数列,还有很多其他的递推方程可以求解。
例如,阶乘的递推方程为f(n) = n * f(n-1),其中f(0) = 1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汉诺塔递归算法复杂度分析
输入规模:盘子的数量n 基本操作:移动盘子 执行次数:M(n)
递推式: 当n>1时,M(n)=M(n-1)+1+M(n-1) n=1时,M(n)=1
解递推方程,得解为M(n)=2n-1
2.1 递归的概念
例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,…,
第2章 递归与分治策略
算法总体思想
• 将题对仍要。这然求k不解个够的子小较问,大题规则分模再别的划问求分题解为分。k割如个成果子k个子问更问题小题,规的如模的规此子模递问 归的进行下去,直到问题规模足够小,很容易 求出其解为止。
=n T(n)
T(n/2)
T(n/2)
T(n/2)
T(n/2)
算法总体思想
if(n==0)
return 1;
else
用于计算
return F(n-1)*n; F(n-1)
基本操作:乘法
执行次数:M(n)
分析:当n>0时,M(n)=M(n-1)+1
当n=0时,M(0)=0 (初始条件)
求解递推方程,M(n)=n
将F(n-1) 乘以n
汉诺塔问题
设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆 盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘 从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆 盘移到塔座b上,并仍按同样顺序叠置。在移动圆盘时 应遵守以下移动规则:
算法mergeSort的递归过程可以消去。 初始序列 [49] [38] [65] [97] [76] [13] [27]
第一步 第二步
[38 49] [65 97] [13 76] [27]
[38 49 65 97]
[13 27 76]
第三步
[13 27 38 49 65 76 97]
合并排序
最坏时间复杂度:O(nlogn) 平均时间复杂度:O(nlogn) 辅助空间:O(n) 稳定性:稳定
别对2个子集合进行排序,最终将排好序的子集合合并成为所
要求的排复好杂序度的分集析合。
O(1)
n 1
public {
static
void
Tm(en)rgeS2Tor(nt(/C2o)m Opa(nra) bnlea1[],
int
left,
int
right)
if (left<righTt()n{)/=/至O(少nl有og2n个) 渐元进素意义下的最优算法
被称为Fibonacci数列。它可以递归地定义为:
1
n0
F
(n)
1
n 1
F (n 1) F (n 2) n 1
第n个Fibonacci数可递归地计算如下: public static int fibonacci(int n)
{ if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2);
例5 整数划分问题 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1。 正整数n的这种表示称为正整数n的划分。求正整数n的不 同划分个数。
例如正整数6有如下11种不同的划分: 6; 5+1; 4+2,4+1+1; 3+3,3+2+1,3+1+1+1; 2+2+2,2+2+1+1,2+1+1+1+1; 1+1+1+1+1+1。
规则1:每次只能移动1个圆盘; 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘
之上; 规则3:在满足移动规则1和2的前提下,可将圆盘移至
a,b,c中任一塔座上。
2.1 递归的概念
例2 Hanoi塔问题 在当pu问nb=l题ic1时规sta,模ti问c较v题大oi比时d h较,a简较no单难i(i。找nt此到n,时一in,般t a只的, i要n方t 将法b,编,in号t因c为此) 1我的们圆尝盘试从塔座a 用直递接{ 归移技至术塔来座解b上决即这可个。问题。 当较大n小圆>的盘i{f1圆从(时n盘塔,> 依座0需)照a要移移利至动用塔规塔座则座b从,c作塔最为座后辅a,移助再至塔设塔座法座。将c此,n时-然1若个后能较,设小将法的剩将圆下n盘的-1依最个 照移动规ha则no从i(塔n-1座, ac移, c至, b塔); 座b。 由此可见mo,vne(个a,圆b)盘; 的移动问题可分为2次n-1个圆盘的移动问题, 这又可以ha递no归i(地n-1用, c上, 述b, 方a)法; 来做。由此可以设计出解Hanoi塔问 题的递} 归算法如下。
缺点:递归算法的运行效率较低,无论是耗费 的计算时间还是占用的存储空间都比非递归 算法要多。
递归小结
解决方法:在递归算法中消除递归调用,使其转 化为非递归算法。
1.采用一个用户定义的栈来模拟系统的递归调用 工作栈。该方法通用性强,但本质上还是递归, 只不过人工做了本来由编译器做的事情,优化 效果不明显。
算法总体思想
• 将求出的小规模的问题的解合并为一个更大规 模的问题的解,自底向上逐步求出原来问题的 解。
T(n)
=n
n/2
n/2
n/2
n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
• 对将这求k出个的子问小题规分模别的求问解题。如的果解子合问并题为的一规模个仍更然大不规够 小模,的则问再题划的分解为,k个自子底问向题,上如逐此步递求归出的原进行来下问去题,的直 到解问。题规模足够小,很容易求出其解为止。
T(n)
=n
n/2
n/2
n/2
n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
人们从大量实践中发现,在用分治法设计算法时,最好使子 问题的规模大致相同。即将一个问题分成大小相等的k个子问题 的处理方法是行之有效的。这种使子问题规模大致相等的做法 是出自一种平衡(balancing)子问题的思想,它几乎总是比子问 题规模不等的做法要好。
合并排序
基本思想:将待排序元素分成大小大致相同的2个子集合,分
int i=(left+right)/2; //取中点
mergeSort(a, left, i);
mergeSort(a, i+1, right);
merge(a, b, left, i, right); //合并到数组b
copy(a, b, left, right); //复制回数组a
}
}
合并排序
问题具有最优子结构性质 利用该问题分解出的子问题的解可以合并为该问题的
解; 该问题所分解出的各个子问题是相互独立的,即子问
题之间不包含公共的子问题。
因这能为条否问特利题征用的是分涉计应治及算用法到复分完杂治全性法取一的决般前于效是提问率随,题着它是如问也否果题是具各规大有子模多这问的数条题增问特是加题征不, 而可如独增以果立加满具的,足备因的了则此,前分大此两治部特条法分征特要问反征做题映,许满了而多足递不这归具必个思备要特想第的征的三工。应条作用特,征重,复则地 可解以公考共虑的子贪问心题算,法此或时动虽态然规也划可。用分治法,但一般 用动态规划较好。
算法总体思想
• 将求出的小规模的问题的解合并为一个更大规 模的问题的解,自底向上逐步求出原来问题的 解。
分分治割T法成(n的一) 设 些计 规思 模想 较是小=,的将相一同n个问难题以,直以接便解 各决 个的 击大 破问 ,题,
分而治之。
凡治众如治寡,分数是也。
n/2
n/2
n/2 ----孙子兵n/2法
1
q(n,
m)
Байду номын сангаас
q(n, n) 1 q(n, n 1)
q(n, m 1) q(n m, m)
n 1, m 1 nm nm
n m 1
正整数n的划分数p(n)=q(n,n)。
递归小结
优点:结构清晰,可读性强,而且容易用数学 归纳法来证明算法的正确性,因此它为设计 算法、调试程序带来很大方便。
((13)) qq((nn,,1n))==11,+nq1(n; ,n-1); 当即正最整n 大数1n加1的数n划n1分1不由大n于1=1n时的,划任分何和正n1整≤数n-n1只的有划一分种组划成分。形式,
(24) q(n,m)=q(n,nm)-,m1)+nq; (n-m,m),n>m>1; 最正大整加数数n的n1最实大际加上数不n能1不大大于于n。m的因划此分,由q(n11,m=m)=的1。划分和 n1≤n-1 的划分组成。
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
2.1 递归的概念
直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。
private static void qSort(int p, int r)
思考题:给定有序表A[1:n],修 改合并排序算法,求出该有序表 的逆序对数。