递归与分治策略
第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)
《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期第九周一、实验目的1、理解递归的概念和分治法的基本思想2、了解适用递归与分治策略的问题类型,并能设计相应的分治策略算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:以下题目要求应用递归与分治策略设计解决方案,本次实验成绩按百分制计,完成各小题的得分如下,每小题要求算法描述准确且程序运行正确。
1、求n个元素的全排。
(30分)2、解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。
(30分)3、设有n=2k个运动员要进行网球循环赛。
设计一个满足要求的比赛日程表。
(40分)提交结果:算法设计分析思路、源代码及其分析说明和测试运行报告。
三、设计分析四、算法描述及程序五、测试与分析六、实验总结与体会#include "iostream"using namespace std;#define N 100void Perm(int* list, int k, int m){if (k == m){for (int i=0; i<m; i++)cout << list[i] << " ";cout << endl;return;}else{for (int i=m; i<k; i++){swap(list[m], list[i]);Perm(list, k, m+1);swap(list[m], list[i]);}}}void swap(int a,int b){int temp;temp=a;a=b;b=temp;}int main(){int i,n;int a[N];cout<<"请输入排列数据总个数:";cin>>n;cout<<"请输入数据:";for(i=0;i<n;i++){cin>>a[i];}cout<<"该数据的全排列:"<<endl;Perm(a,n,0);return 0;}《算法设计与分析》实验报告实验二递归与分治策略应用提高学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期一、实验目的1、深入理解递归的概念和分治法的基本思想2、正确使用递归与分治策略设计相应的问题的算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。
士兵站队问题

如何确定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; }
试说明快速傅里叶变换的基本思路和原理

快速傅里叶变换的基本思路和原理一、引言快速傅里叶变换(FFT)是一种高效的算法,用于计算离散傅里叶变换(DFT)及其逆变换。
它通过将DFT计算中的复杂度从O(N^2)降低到O(N log N),极大地提高了计算效率,成为信号处理、图像处理、通信等领域中的重要工具。
本文将介绍快速傅里叶变换的基本思路和原理,主要包括分治策略、递归实施、周期性和对称性、蝶形运算、高效算法等方面。
二、分治策略快速傅里叶变换的基本思路是将原问题分解为若干个子问题,通过对子问题的求解,逐步递归地得到原问题的解。
这种分治策略的思想来源于算法设计中的“分而治之”原则,即将一个复杂的问题分解为若干个较小的、简单的问题来处理。
在FFT中,分治策略将DFT的计算过程分为多个步骤,逐步简化问题规模,最终实现高效的计算。
三、递归实施递归是实现分治策略的一种常用方法。
在快速傅里叶变换中,递归地实施分治策略,将问题规模不断缩小,直到达到基本情况(通常是N=1或2),然后逐步推导到原问题。
递归实施使得FFT算法的代码简洁明了,易于实现和理解。
同时,递归也使得算法能够利用计算机的存储器层次结构,将计算过程中的中间结果存储起来,避免重复计算,进一步提高计算效率。
四、周期性和对称性在快速傅里叶变换中,利用了离散傅里叶变换的周期性和对称性。
周期性是指DFT的结果具有周期性,即对于输入序列x[n],其DFT的结果X[k]具有N的周期性。
对称性是指DFT的结果具有对称性,即对于输入序列x[n],其DFT的结果X[k]具有对称性。
这些性质在FFT算法中得到了广泛应用,它们有助于简化计算过程,提高计算效率。
例如,在蝶形运算中,利用周期性和对称性可以避免某些不必要的计算,从而减少运算量。
五、蝶形运算蝶形运算是快速傅里叶变换中的基本运算单元。
它利用离散傅里叶变换的周期性和对称性,将多个复数相加和相乘组合在一起,形成一个类似蝴蝶形状的运算流程。
蝶形运算的复杂度为O(log N),是实现快速傅里叶变换的关键步骤之一。
《算法设计与分析》(全)

1.1、算法与程序
程序:是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(4)。 例如操作系统,是一个在无限循环中执行的程序, 因而不是一个算法。 操作系统的各种任务可看成是单独的问题,每一个 问题由操作系统中的一个子程序通过特定的算法来实 现。该子程序得到输出结果后便终止。
渐近分析记号的若干性质
(1)传递性: ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= O(g(n)), g(n)= O (h(n)) f(n)= O (h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= o(g(n)), g(n)= o(h(n)) f(n)= o(h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); (2)反身性: ➢ f(n)= (f(n));f(n)= O(f(n));f(n)= (f(n)). (3)对称性: ➢ f(n)= (g(n)) g(n)= (f(n)) . (4)互对称性: ➢ f(n)= O(g(n)) g(n)= (f(n)) ; ➢ f(n)= o(g(n)) g(n)= (f(n)) ;
巢湖学院计算机科学与技术系
渐近分析记号的若干性质
规则O(f(n))+O(g(n)) = O(max{f(n),g(n)}) 的证明: ➢ 对于任意f1(n) O(f(n)) ,存在正常数c1和自然数n1,使得对
所有n n1,有f1(n) c1f(n) 。 ➢ 类似地,对于任意g1(n) O(g(n)) ,存在正常数c2和自然数
巢湖学院计算机科学与技术系
第1章 算法引论
计算机专业课《算法》_第二章 递归与分治策略

“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
初始条件与递归方程是递归函数的二个要素
算法设计与分析习题与实验题(12.18)
《算法设计与分析》习题第一章引论习题1-1 写一个通用方法用于判定给定数组是否已排好序。
解答:Algorithm compare(a,n)BeginJ=1;While (j<n and a[j]<=a[j+1]) do j=j+1;If j=n then return trueElseWhile (j<n and a[j]>=a[j+1]) do j=j+1;If j=n then return true else return false end ifEnd ifend习题1-2 写一个算法交换两个变量的值不使用第三个变量。
解答:x=x+y; y=x-y; x=x-y;习题1-3 已知m,n为自然数,其上限为k(由键盘输入,1<=k<=109),找出满足条件(n2-mn-m2)2=1 且使n2+m2达到最大的m、n。
解答:m:=k; flag:=0;repeatn:=m;repeatl:=n*n-m*n-m*n;if (l*l=1) then flag:=1 else n:=n-1;until (flag=1) or (n=0)if n=0 then m:=m-1until (flag=1) or (m=0);第二章基础知识习题2-1 求下列函数的渐进表达式:3n 2+10n ; n 2/10+2n ; 21+1/n ; log n 3; 10 log3n 。
解答: 3n 2+10n=O (n 2), n 2/10+2n =O (2n ), 21+1/n=O (1), log n 3=O (log n ),10 log3n =O (n )。
习题2-2 说明O (1)和 O (2)的区别。
习题2-3 照渐进阶从低到高的顺序排列以下表达式:!n ,3/22,2,20,3,log ,4n n n n n 。
解答:照渐进阶从低到高的顺序为:!n 、 3n、 24n 、23n 、20n 、log n 、2习题2-4(1) 假设某算法在输入规模为n 时的计算时间为n n T 23)(⨯=。
计算机算法设计五大常用算法的分析及实例
计算机算法设计五⼤常⽤算法的分析及实例摘要算法(Algorithm)是指解题⽅案的准确⽽完整的描述,是⼀系列解决问题的清晰指令,算法代表着⽤系统的⽅法描述解决问题的策略机制。
也就是说,能够对⼀定规范的输⼊,在有限时间内获得所要求的输出。
如果⼀个算法有缺陷,或不适合于某个问题,执⾏这个算法将不会解决这个问题。
不同的算法可能⽤不同的时间、空间或效率来完成同样的任务。
其中最常见的五中基本算法是递归与分治法、动态规划、贪⼼算法、回溯法、分⽀限界法。
本⽂通过这种算法的分析以及实例的讲解,让读者对算法有更深刻的认识,同时对这五种算法有更清楚认识关键词:算法,递归与分治法、动态规划、贪⼼算法、回溯法、分⽀限界法AbstractAlgorithm is the description to the problem solving scheme ,a set of clear instructions to solve the problem and represents the describe the strategy to solve the problem using the method of system mechanism . That is to say, given some confirm import,the Algorithm will find result In a limited time。
If an algorithm is defective or is not suitable for a certain job, it is invalid to execute it. Different algorithms have different need of time or space, and it's efficiency are different.There are most common algorithms: the recursive and divide and conquer、dynamic programming method、greedy algorithm、backtracking、branch and bound method.According to analyze the five algorithms and explain examples, make readers know more about algorithm , and understand the five algorithms more deeply.Keywords: Algorithm, the recursive and divide and conquer, dynamic programming method, greedy algorithm、backtracking, branch and bound method⽬录1. 前⾔ (4)1.1 论⽂背景 (4)2. 算法详解 (5)2.1 算法与程序 (5)2.2 表达算法的抽象机制 (5)2.3 算法复杂性分析 (5)3.五中常⽤算法的详解及实例 (6)3.1 递归与分治策略 (6)3.1.1 递归与分治策略基本思想 (6)3.1.2 实例——棋盘覆盖 (7)3.2 动态规划 (8)3.2.1 动态规划基本思想 (8)3.2.2 动态规划算法的基本步骤 (9)3.2.3 实例——矩阵连乘 (9)3.3 贪⼼算法 (11)3.3.1 贪⼼算法基本思想 (11)3.3.2 贪⼼算法和动态规划的区别 (12)3.3.3 ⽤贪⼼算法解背包问题的基本步骤: (12)3.4 回溯发 (13)3.4.1 回溯法基本思想 (13)3.3.2 回溯发解题基本步骤 (13)3.3.3 实例——0-1背包问题 (14)3.5 分⽀限界法 (15)3.5.1 分⽀限界法思想 (15)3.5.2 实例——装载问题 (16)总结 (18)参考⽂献 (18)1. 前⾔1.1 论⽂背景算法(Algorithm)是指解题⽅案的准确⽽完整的描述,是⼀系列解决问题的清晰指令,算法代表着⽤系统的⽅法描述解决问题的策略机制。
c语言中的算法基本概念
c语言中的算法基本概念C语言中的算法基本概念在计算机科学中,算法是指解决特定问题或执行特定任务的一组有限指令序列。
而C语言作为一种高级编程语言,常用于编写和实现各种算法。
本文将一步一步回答关于C语言中算法基本概念的问题。
一、什么是算法?算法是指解决特定问题或执行特定任务的一组有限指令序列。
它是为了解决问题而采取的一种策略或方法。
算法可以用来计算、排序、搜索、加密等各种操作。
在计算机科学中,算法的设计和分析是一个重要的研究领域。
二、C语言中如何表示算法?在C语言中,算法通常以函数的形式表示。
函数是一段可重复使用的代码,它接受输入参数并产生输出结果。
通过将算法封装在函数中,可以在程序中多次调用该函数来解决问题。
C语言中的函数通常包含函数声明和函数定义两个部分。
函数声明告诉编译器函数的名称、参数类型和返回值类型,而函数定义则是函数的具体实现。
三、C语言中的算法常见操作1. 输入输出操作:C语言提供了丰富的输入输出函数来与用户进行交互。
例如,使用scanf函数从键盘读取输入数据,使用printf函数将结果输出到屏幕上。
2. 条件判断和循环结构:在算法中经常需要根据条件进行判断和循环执行相应的操作。
C语言提供了if-else、switch-case等条件判断语句,和for、while、do-while等循环语句,用于控制程序的流程。
3. 数组和指针操作:数组是一种存储相同类型数据的集合,而指针是指向内存地址的变量。
在算法中,我们可以利用数组和指针来处理大量数据和进行数据的访问和修改。
C语言提供了强大的数组和指针操作功能。
4. 递归:递归是一种在算法中常用的技术,它指的是由函数自身调用自身。
递归在解决一些复杂问题时非常有用,例如在树的遍历和排序算法中常见。
四、算法的性能分析算法的性能分析是衡量算法优劣的一种方法。
主要考虑两个方面:时间复杂度和空间复杂度。
1. 时间复杂度:时间复杂度是算法执行时间随输入规模增长的增长量度。
基于分治和递归策略的排序算法及实现
关键 词 :排序 ;关 键 字 ;分 治 ;递 归
中图分类号 : P 1 T 32
文献标志码 :A
文章编号 :0 6 8 2 (0 2 0 — 7 0 10 i a g ihm bas d o di i — nd- o e n v de a c nque t a e y nd e ur i e t at g a t r a i a i r s r t g a r c sv s r e y nd is e lz ton
b s d n i i e a d c n u r n r c r i e ta e is s u f r a d Co a e o d v d — n — o q e a d e u sv sr t g e i p t o w r . mpa e wi s l c i n o tn a g rt m, t e x ha g n rd t h ee to s ri g l o h i h e c n i g fe u n y f t s l o t m s o v o sy l s h n t a f ca sc e e t n o i g l o t m u e a o s c r u t n e . r q e c o hi a g r h i b i u l e s t a t o l s i s l ci s r n ag r h i h o t i nd r v r u ic ms a c s i K e r s s ri g;k y r y wo d : o t n e wo d; d v d a d c n u r r c r i n i i e n o q e ; e u so
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
17
3.2.3 二分搜索技术
给定n个元素a[0:n-1],需要在这n个元素中找出一个 特定元素x。
首先对n个元素进行排序,可以使用C++标准模板库函数sort()。 比较容易想到的是用顺序搜索方法,逐个比较a[0:n-1]中的元 素,直至找到元素x或搜索遍整个数组后确定x不在其中。 因此在最坏的情况下,顺序搜索方法需要 O(n)次比较。 二分搜索技术充分利用了n个元素已排好序的条件,采用分治策 略的思想,在最坏情况下用O(log n) 时间完成搜索任务。
2
3.1 递归算法
程序直接或间接调用自身的编程技巧称为递归算法 (Recursion)。 一个过程或函数在其定义或说明中又直接或间接调用 自身的一种方法. 它通常把一个大型复杂的问题层层转化为一个与原问 题相似的规模较小的问题来求解。 递归策略只需少量的程序就可描述出解题过程所需要 的多次重复计算,大大地减少了程序的代码量。
3
3.1 递归算法
递归需要有边界条件、递归前进段和递归返回段。
当边界条件不满足时,递归前进; 当边界条件满足时,递归返回。
递归的缺点:
递归算法解题的运行效率较低。 在递归调用过程中,系统为每一层的返回点、局部变量等开辟了堆 栈来存储。递归次数过多容易造成堆栈溢出等。
4
3.1.1 FIBONACCI数列
r1=1的排列
r2=2的排列
r3=3的排列
r4=4的排列
3214 3241 3124 31213 4321 4312 4132 4123
} 数组list[]={1, 2, 3, 4, 5, 6,7},则调用Perm(list,0,3) 就是产生元素1~4的全排列。
3.3 Big String
1
第3章 递归与分治策略
任何一个可以用计算机求解的问题所需的计算时间都与其规 模n有关。问题的规模越小,越容易直接求解,解题所需的 计算时间也越少。 分治法的设计思想是,将一个难以直接解决的大问题,分割 成一些规模较小的相同问题,以便各个击破,分而治之。 如果原问题可分割成k个子问题(1<k≤n),且这些子问 题都可解,并可利用这些子问题的解求出原问题的解,那么 这种分治法就是可行的。 由分治法产生的子问题往往是原问题的较小模式,这就为使 用递归技术提供了方便。
算法3.6 二分搜索算法 //数组a[]中有n个元素,已经按升序排序,待查找的元素x template<class Type> int BinarySearch(Type a[],const Type& x,int n) { int left=0; //左边界 int right=n-1; //右边界 while(left<=right) { int middle=(left+right)/2; //中点 if (x==a[middle]) return middle; if (x>a[middle]) left=middle+1; else right=middle-1; } return -1; //未找到x }
7
1234 2134 1243 2143 1324 2314 //产生从元素k~m的全排列,作为前k—1个元素的后缀3 4 1 1342 2 void Perm(int list[], int k, int m) 1432 2431 1423 2413 {
算法3.3 全排列问题的递归算法
//构成了一次全排列,输出结果 if(k==m) { for(int i=0;i<=m;i++) cout<<list[i]<<" "; cout<<endl; } else //在数组list中,产生从元素k~m的全排列 for(int j=k;j<=m;j++) { swap(list[k],list[j]); Perm(list,k+1,m); swap(list[k],list[j]); }
整数划分问题是算法中的一个经典命题之一。把一个正整 数n表示成一系列正整数之和: 正整数n的这种表示称为正整数n的划分。正整数n的不同 划分个数称为正整数n的划分数,记作 p(n) 。
正整数6有如下11种不同的划分,所以 p(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
16
3.2.2 分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
1. 该问题的规模缩小到一定的程度就可以容易地解决; 2. 该问题可以分解为若干个规模较小的相同问题,即该问题具有 最优子结构性质; 3. 利用该问题分解出的子问题的解可以合并为该问题的解; 4. 该问题所分解出的各个子问题是相互独立的,即子问题之间不 包含公共的子子问题。
12
3.1.3 整数划分问题—算法分析
正整数n的划分数p(n)=f(n,n)
1 f ( n, n ) f ( n, m ) 1 f (n, n 1) f (n, m 1) f (n m, m) n 1, m 1 nm nm n m 1
数组list[]={1, 2, 3, 4, 5, 6,7},则调用Perm(list,2,4) 就是产生元素3~5的全排列。 令int from=k; 则for(int i=from;i<=m;i++)
12345 12354 12435 12453 12543 12534
9
3.1.3 整数划分问题
8
算法3.3 全排列问题的递归算法
//产生从元素k~m的全排列,作为前k—1个元素的后缀 void Perm(int list[], int k, int m) { if(k==m) //构成了一次全排列,输出结果 { for(int i=0;i<=m;i++) cout<<list[i]<<" "; cout<<endl; } else //在数组list中,产生从元素k~m的全排列 for(int j=k;j<=m;j++) { swap(list[k],list[j]); Perm(list,k+1,m); swap(list[k],list[j]); } }
f (6, f (6, 3) f (2, 4) f (6, 3) f (2, 2) 4)
f(6,4)=9 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 f(6,3)=7 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 f(2,2)=2 4+2, 4+1+1 (实际上是2的划分)
6
3.1.2 集合的全排列问题
r1=1的排列 1234 1243 1324 1342 1432 1423
r2=2的排列 2134 2143 2314 2341 2431 2413
r3=3的排列 3214 3241 3124 3142 3412 3421
r4=4的排列 4231 4213 4321 4312 4132 4123
13
3.2 分治策略
分治策略是对于一个规模为n的问题,若该问题可以 容易地解决(比如说规模n较小)则直接解决,否则 将其分解为k个规模较小的子问题,这些子问题互相 独立且与原问题形式相同。 递归地解这些子问题,然后将各子问题的解合并得 到原问题的解。
14
3.2.1 分治法的基本步骤
分治法在每一层递归上都有三个步骤:
1 F ( n) 1 F(n- ) F(n-2 ) (n 0, 1) (n 1)
算法3.1 Fibonacci数列的递归算法
int fib(int n) { if (n<=1) return 1; return fib(n-1)+fib(n-2); }
该算法的效率非常低,因为重复递归的次数太多。
0 7
left
1 14
2 17
3 21
4 27
5 31
6 38
7 42
8 46
9 53
10 75
right
18
middle
二分搜索算法的基本思想是将n个元素分成个数大致相 同的两半,取a[n/2]与x作比较。
如果x=a[n/2],则找到x,算法终止。 如果x<a[n/2],则我们只要在数组a的左半部分继续搜索x。 如果x>a[n/2],则我们只要在数组a的右半部分继续搜索x。
第3章 递归与分治策略
3.1 递归算法
3.1.1 Fibonacci数列 3.1.2 集合的全排列问题 3.1.3 整数划分问题
3.2 分治策略
3.2.1 分治法的基本步骤 3.2.2 分治法的适用条件 3.2.3 二分搜索技术 3.2.4循环赛日程表 3.2.5 棋盘覆盖问题 3.2.6 选择问题 3.2.7输油管道问题 3.2.8 半数集问题 3.2.9 整数因子分解 3.2.10取余运算