第二章递归与分治策略

合集下载

分治策略

分治策略
分治策略
分治法的设计思想是: 将一个难以直接解决的大问
题,分割成一些规模较小的
相同问题,以便各个击破,
分而治之。
1、分治策略的定义;
2、分治法解题的步骤;
3、典型例题与练习;
1、分治策略的定义
对于一个规模为n的问题,若该问题 可以容易地解决(比如说规模n较小)则 直接解决,否则将其分解为k个规模较小 的子问题,这些子问题互相独立且与原问
• • • • • • • • • • • • • • • • • • • • • • • • • • • •
var i,j,k,kk:integer; begin if ed-st>0 then begin merge(st,(st+ed) div 2); merge((st+ed) div 2+1,ed); aaa[st,ed]:=aaa[st,(st+ed) div 2]+aaa[(st+ed) div 2+1,ed]; i:=st; j:=(st+ed) div 2+1; while (i<=(st+ed) div 2+1) and (j<=ed) do if a[i]>a[j] then begin aaa[st,ed]:=aaa[st,ed]+ed-j+1; i:=i+1; end else j:=j+1; i:=st; j:=(st+ed) div 2+1; k:=st; while (i<=(st+ed) div 2) and (j<=ed) do if a[i]>a[j] then begin aa[k]:=a[i];k:=k+1;i:=i+1;end else begin aa[k]:=a[j];k:=k+1;j:=j+1;end; if i<=(st+ed) div 2 then for kk:=i to (st+ed) div 2 do begin aa[k]:=a[kk];k:=k+1;end; if j<=ed then for kk:=j to ed do begin aa[k]:=a[kk];k:=k+1;end; for k:=st to ed do a[k]:=aa[k]; end; end;

第2章 递归与分治_作业答案讲解

第2章 递归与分治_作业答案讲解

具体执行过程:求最大值
0 1 2 3 4 5 6 7 8 9 10 11 12 13 24 -13 29 113 87 65 -9 36 14 76 44 83 67 5 0 1 2 3 4 5 6 24 -13 29 113 87 65 -9 0 1 2 3 24 -13 29 113 0 1 24 -13 2 3 29 113 4 5 6 87 65 -9 7 8 9 10 11 12 13 36 14 76 44 83 67 5 7 8 9 10 36 14 76 44 7 8 36 14 7 36 9 10 76 44 11 12 13 83 67 5 11 12 83 67 11 83 12 67 13 5
课后练习
• 练习2:分析如下时间函数的复杂度,并说明 原因。 1. 利用递归树说明以下时间函数的复杂度:
O(1) T ( n) 3T ( n ) O( n) 4 n1 n1
2. 利用主定理说明以下时间函数的复杂度:
T(n) = 16T(n/4) + n
T(n) = T(3n/7) + 1
课后练习
• 练习1:给定数组a[0:n-1], 1. 试设计一个分治法算法,找出a[0:n-1]中元素最 大值和最小值; 2. 写出该算法时间函数T(n)的递推关系式; 3. 分析该算法的时间复杂度和空间复杂度。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 24 -13 29 113 87 65 -9 36 14 76 44 83 67 5
• 递归公式:
– 设n个元素的集合可以划分为F(n,m)个不同的由 m个非空子集组成的集合。 F(n,m) = 1, when n=0, n=m, n=1, or m=1 F(n,m) = 0, when n<m 否则 F(n,m)=F(n-1,m-1)+m*F(n-1,m)

递归与分治算法心得

递归与分治算法心得

递归与分治算法心得
递归与分治算法都是常用的算法思想,可以很好地解决复杂问题。

递归算法是通过将问题分解为相同或相似的子问题来解决整个问题,然后再逐步合并回原问题的过程。

递归算法通常需要明确边界条件,以确保递归能够正确地停止。

分治算法是将问题分解成若干个相同或相似的子问题,递归地解决这些子问题,然后合并这些子问题的解来解决原始问题。

通常,分治算法可以高效地解决问题,但需要注意分解问题的方式和合并子问题的解的过程。

在实际应用中,递归和分治算法可以相互结合,以解决更加复杂的问题。

例如,可以使用分治算法来将问题分解成多个子问题,然后使用递归算法来解决这些子问题。

此外,还可以在递归算法中使用分治算法来对子问题进行分解和合并。

总而言之,递归与分治算法都是非常有用的算法思想,可以在许多领域中得到应用。

但是,在实际使用时,需要仔细考虑问题的性质和算法的复杂度,以确保算法的正确性和效率。

- 1 -。

五大常用算法

五大常用算法
Your company slogan
回溯法
基本概念 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发 现原先选择并不是最优或达不到目标,就退回一步重新选择,这种走不通就退回再走的方 法称为回溯法。 基本思想 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解 空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结 点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回 溯法就是对隐式图的深度优先搜索算法)。 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍 才结束。 而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束 。
Your company slogan
贪心算法
例 在漆黑的夜里,四位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的 话,大家是无论如何也不敢过桥去的。不幸的是,四个人一共只带了一只手电筒,而桥窄得 只够让两个人同时过。如果各自单独过桥的话,四人所需要的时间分别是1、2、5、8分钟; 而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题 是,如何设计一个方案,让这四人尽快过桥 。
2012年林清华等人提出一种新型快速中值滤波算法,主要应用于医学图像.文中方法利 用中值滤波算法对滤波窗口内其他像素点的排列顺序不作要求的特点,将基于排序寻找中 值的过程转换为基于分治查找中值的过程。在分治查找过程中,利用医学图像未受干扰时 图像中像素值的变化是渐变的特性,优先选用中心点附近的像素值进行分治查找,以达到
图1 动态规划决策过程示意图 实际应用中可以按以下几个简化的步骤进行设计: (1)分析最优解的性质,并刻画其结构特征。 (2)递归的定义最优解。 (3)以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值。 (4)根据计算最优值时得到的信息B→ 2 A←1 AC → 5 A←1 AD → 8 一共就是2+1+5+1+8=17分钟。

递归和分治法

递归和分治法

递归和分治法摘要:1.递归和分治法的定义2.递归和分治法的区别3.递归和分治法的应用实例4.递归和分治法的优缺点正文:递归和分治法是计算机科学中常用的两种算法设计技巧。

它们在解决问题时都采用了将问题分解成更小子问题的思路,但在具体实现上却有所不同。

下面,我们来详细了解一下递归和分治法。

1.递归和分治法的定义递归法是指在算法中调用自身来解决问题的方法。

递归函数在执行过程中,会将原问题分解成规模更小的相似子问题,然后通过调用自身的方式,解决这些子问题,最后将子问题的解合并,得到原问题的解。

分治法是指将一个大问题分解成若干个规模较小的相似子问题,然后分别解决这些子问题,最后将子问题的解合并,得到原问题的解。

分治法在解决问题时,通常需要设计一个主函数(master function)和一个子函数(subfunction)。

主函数负责将问题分解,子函数负责解决子问题。

2.递归和分治法的区别递归法和分治法在解决问题时都采用了将问题分解成更小子问题的思路,但它们在实现上存在以下区别:(1)函数调用方式不同:递归法是通过调用自身来解决问题,而分治法是通过调用不同的子函数来解决问题。

(2)递归法必须有递归出口,即必须有一个基线条件,而分治法不一定需要。

3.递归和分治法的应用实例递归法应用广泛,例如斐波那契数列、汉诺塔问题、八皇后问题等。

分治法也有很多实际应用,例如快速排序、归并排序、大整数乘法等。

4.递归和分治法的优缺点递归法的优点是代码简单易懂,但缺点是容易产生大量的重复计算,导致时间复杂度较高。

分治法的优点是时间复杂度较低,但缺点是代码实现相对复杂,需要设计主函数和子函数。

总之,递归和分治法都是解决问题的有效方法,具体应用需要根据问题的特点来选择。

递归与分治ppt课件

递归与分治ppt课件
C三个柱子间移动。}
2023/10/8
计算机算法设计与分析
3
Hanoi塔问题的时间复杂性
n Hanoi塔问题的时间复杂性为O(2n)。 n 证明:对n归纳证明move(n) = 2n – 1。 n 归纳基础:当n = 1, move(1) = 1 = 21 – 1。 n 归纳假设:当n k, move(n) = 2n – 1。 n 归纳步骤:当n= k + 1,移动次数为
2、除法,即n / b,的形式
2023/11/4
计算机算法设计与分析
21
递归算法的时间复杂性
n 若~为减法,即n – b,则有:
T(n) = aT(n – b) + D(n)
= a(aT(n – 2b) + D(n – b)) + D(n) =
k–1
k–1
= akT(1) + ai D(n – ib) = ak + ai D(n – ib)
n q最(n简, m单)情{ 形1:(1) q(n, 1)=1, q(1, mn)==1 n或, mm≥1=;1 n 递q(iin归ff,((mnn关)<=系==1):1q1)||(|((+|nm2(,)qmm<(qn=–(1,n1=)n,)–+1n1)q))(=rrnee–1ttmuu+rr,nqnm(01n);;, nnn>–≤1m)m,>n1>1; n 产i生f (n的=新= 情1) 况|| (:n < m) return 1 + q(n, n–1); n (3r)eqtu(nr,nmq)(n=,qm(n–,1m) +–1q)(n+–qm(,nm–m);, m} ), n>m>1 n (整4)数q(nn的, m划)分= q数(nρ,(n),=nq<(nm, n。)。

士兵站队问题

士兵站队问题

如何确定X轴方向上的最佳的“最终位置”?
n个士兵他们相应的X轴坐标为:X0,X1,X2…Xn-1 设“最终位置”的X轴坐标值为:k,k+1,k+2…k+(n-1) 则最优步数:S=|X0-k|+|X1-(k+1)|+|X2-(k+2)|+…+|Xn-1-(k+(n-1))| 经过变形:S=|X0-k|+|(X1-1)-k|+|(X2-2)-k|+…+|(Xn-1-(n-1))-k|
第二章:递归与分治策略 ---士兵站队问题
问题描述:
• 在一个划分成网格的操场上,n个士兵散乱地 站在网格点上。网格点由整数坐标(x,y)表示。士 兵们可以沿网格边上、下、左、右移动一步,但 在同一时刻任一网格点上只能有一名士兵。按照 军官的命令,士兵们要整齐地列成一个水平队列, 即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何选 择x和y的值才能使士兵们以最少的总移动步数排 成一列。
• • • • • • • • • • • • • • • • • • • • • • • •
#include <iostream> #include <math.h> #include <stdlib.h> using namespace std; void Swap(int &a,int &b)//交换函数 { int temp;//定义一个交换的临时变量 temp=a; a=b; b=temp; } int partition(int *a,int low,int high)//确定一个基准元素以对数组元素进行划分 { int key = a[low];//key初始化为a的首元素 while(low<high) { while(low<high && a[high]>=key) high--; a[low] = a[high]; while(low<high && a[low]<=key) low++; a[high]=a[low]; } a[low]=key; return low; }

计算机专业课《算法》_第二章 递归与分治策略

计算机专业课《算法》_第二章 递归与分治策略

“Hanoi 塔”问题演示 a 初始 a 步骤1 a
c
b
c
“Hanoi 塔”问题程序
void hanoi(int n,a,b,c)
{ if n == 1 move( 1, a, b );
else { hanoi( n-1, a, c, b );
move(n, a, b ); hanoi( n-1, c,b, a) ;
• 递归优点:结构清晰,可读性强
• 递归缺点:递归算法的运行效率较低,无论是耗 费的计算时间还是占用的存储空间都比非递归算 法要多。
整数划分问题的递归关系q(n,m)
如设p(n)为正整数n的划分数,则难以找到递归关系 • q(n,m):正整数n的不同的划分中,最大加数不 大于m的划分个数个数 q(n,m)=
1 q(n,n) 1+q(n,n-1) q(n,m-1)+q(n-m,m) n=1, m=1 n<m n=m n>m>1
递归函数举例(5)
学习要点
理解递归的概念。 掌握设计有效算法的分治策略。
通过典型范例,学习分治策略设计技巧。
2.1 递归的概念
• 递归算法:一个直接或间接地调用自身的算法 • 递归方程:对于递归算法,一般可把时间代 价表示为一个递归方程 • 递归函数:使用函数自身给出定义的函数 • 解递归方程最常用的方法是进行递归扩展
递归函数举例(1)
• 阶乘函数 n !=
1 n(n-1)! n=1 n>1
• Fibonacci数列
1 n=0
F(n)=
1 F(n-1)+F(n-2)
n=1 n>1
初始条件与递归方程是递归函数的二个要素
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.1 递归的概念
例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。
2.1 递归的概念
例5 整数划分问题 前面的几个例子中,问题本身都具有比较明显的递归关系,因 而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关 系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个 数记作q(n,m)。可以建立q(n,m)的如下递归关系。
• 将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
T(n)
n/4
=
n/4
n
n/4 n/4
T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16)T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16
1 q(n, n) q(n, m) 1 q(n, n 1) q(n, m 1) q(n m, m)
正整数n的划分数p(n)=q(n,n)。
n 1, m 1 nm nm n m 1
整数划分问题递归程序
int q(int n,int m) { if ((n<1)||(m<1)) return 0; if ((n= =1)||(m= =1)) return 1; if(n<m) return q(n,n); if (n= =m) return q(n,m-1)+1; return q(n,m-1)+q(n-m,m); }
2.1 递归的概念
例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,…, 被称为Fibonacci数列。它可以递归地定义为:
1 n0 F ( n) 1 n 1 F (n 1) F (n 2) n 1
第n个Fibonacci数可递归地计算如下: int fibonacci(int n) { if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); }
分治策略的定义
• 分治策略是:对于一个规模为n的问 题,若该问题可以容易地解决(比如 说规模n较小)则直接解决,否则将其 分解为k个规模较小的子问题,这些子 问题互相独立且与原问题形式相同, 递归地解这些子问题,然后将各子问 题的解合并得到原问题的解。这种算 法设计策略叫做分治法。
• 如果原问题可分割成k个子问题,1<k≤n ,且这些子问题都可解,并 可利用这些子问题的解求出原问题的解,那么这种分治法就是可行 的。 • 由分治法产生的子问题往往是原问题的较小模式,这就为使用递归 技术提供了方便。在这种情况下,反复应用分治手段,
第2章 递归与分治策略
2.1 递归的概念
• 直接或间接地调用自身的算法称为 递归算法。 • 用函数自身给出定义的函数称为 递归函数。
下面来看几个实例。
2.1 递归的概念
例1 阶乘函数 阶乘函数可递归地定义为:
边界条件
n0 1 n! n(n 1)! n 0
递归方程 边界条件与递归方程是递归函数的二个要素,递归函 数只有具备了这两个要素,才能在有限次计算后得出 结果。
• 分治法的设计思想是,将一个难以直接 解决的大问题,分割成一些规模较小的 相同问题,以便各个击破,分而治之。
算法总体思想
• 将要求解的较大规模的问题分割成k个更小规模的子问题。
T(n)
=
n
T(n/4)
T(n/4)
T(n/4)
T(n/4)
算法总体思想
• 对这k个子问题分别求解。如果子问题的规模仍然不够 小,则再划分为k个子问题,如此递归的进行下去,直 到问题规模足够小,很容易求出其解为止。
2.1 递归的概念
例5 整数划分问题 前面的几个例子中,问题本身都具有比较明显的递归关系,因 而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关 系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个 数记作q(n,m)。可以建立q(n,m)的如下递归关系。 (1)q(n,1)=1; (1) q(n,1)=1,n1; (2)q(n,m)=q(n,n),m≥n; 当最大加数n1不大于1时,任何正整数n只有一种划分形式, n (3) q(n,n)=1+q(n,n-1); 即 n 111 正整数n的划分由n1=n的划分和n1≤n-1的划分组成。 (2) q(n,m)=q(n,n),mn; (4) q(n,m)=q(n,m-1)+q(n-m,m),n>m>1; 正整数n的最大加数n1不大于m的划分由n1=m的划分和 最大加数n1实际上不能大于n。因此,q(1,m)=1。 n1≤m-1 的划分组成。
递归小结
优点:结构清晰,可读性强,而且容易用数学归 纳法来证明算法的正确性,因此它为设计算法、 调试程序带来很大方便。 缺点:递归算法的运行效率较低,无论是耗费的 计算时间还是占用的存储空间都比非递归算法 要多。
递归小结
解决方法:在递归算法中消除递归调用,使其转 化为非递归算法。 1.采用一个用户定义的栈来模拟系统的递归调用 工作栈。该方法通用性强,但本质上还是递归, 只不过人工做了本来由编译器做的事情,优化 效果不明显。 2.用递推来实现递归函数。 3.通过Cooper变换、反演变换能将一些递归转化 为尾递归,从而迭代求出结果。
但本例中的Ackerman函数却无法找到非递归的定义。
2.1 递归的概念
例3 Ackerman函数 • A(n,m)的自变量m的每一个值都定义了一个单变量函数: • M=0时,A(n,0)=n+2 • M=1时,A(n,1)=A(A(n-1,1),0)=A(n-1,1)+2,和 A(1,1)=2故A(n,1)=2*n • M=2时,A(n,2)=A(A(n-1,2),1)=2A(n-1,2),和 A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)= 22 • M=4时,A(n,4)的增长速度非常快,以至于没有适当的 n 数学式子来表示这一函数。
2
2.1 递归的概念
例3 Ackerman函数 • 定义单变量的Ackerman函数A(n)为,A(n)=A(n,n)。 • 定义其拟逆函数α(n)为:α(n)=min{k|A(k)≥n}。 即α(n)是使n≤A(k)成立的最小的k值。 • α(n)在复杂度分析中常遇到。对于通常所见到的正 整数n,有α(n)≤4。但在理论上α(n)没有上界,随 着n的增加,它以难以想象的慢速度趋向正无穷大。
T(n)
n/4
=
n/4
n
n/4 n/4
T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16)T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16) T(n/16
算法总体思想
2.1 递归的概念
例6 Hanoi塔问题 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塔问题 的递归算法如下。 } }
后两种方法在时空复杂度上均有较大改善, 但其适用范围有限。
• 任何一个可以用计算机求解的问题所需的计算时间都与其规 模有关。 • 问题的规模越小,越容易直接求解,解题所需的计算时间 也越少。 • 例如,对于n个元素的排序问题, • n=1时,不需任何计算。 • n=2时, 只要作一次比较即可排好序。 • n=3时 只要作3次比较即可,…。 • 而当n较大时,问题就不那么容易处理了。要想直接解决一 个规模较大的问题,有时是相当困难的。
2.1 递归的概念
例3 Ackerman函数 前2例中的函数都可以找到相应的非递归方式定义:
n! 1 2 3 (n 1) n
1 5 n1 1 5 n1 1 F (n) 2 5 2
边界条件
递归方程
2.1 递归的概念
例3 Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这 个函数是双递归函数。 Ackerman函数A(n,m)定义如下:
相关文档
最新文档