第二章递归与分治策略(1)
第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)
算法分析与设计习题集整理

算法分析与设计习题集整理第一章算法引论一、填空题:一、算法运行所需要的计算机资源的量,称为算法复杂性,主要包括时间复杂度和空间复杂度。
二、多项式10()mm A n a n a n a =+++的上界为O(n m )。
3、算法的大体特征:输入、输出、肯定性、有限性。
4、如何从两个方面评价一个算法的好坏:时间复杂度、空间复杂度。
五、计算下面算法的时间复杂度记为: O(n 3) 。
for(i=1;i<=n;i++)for(j=1;j<=n;j++) {c[i][j]=0; for(k=1;k<=n;k++) c[i][j]= c[i][j]+a[i][k]*b[k][j]; }六、描述算法常常利用的方式:自然语言、伪代码、程序设计语言、流程图、盒图、PAD 图。
7、算法设计的大体要求:正确性 和 可读性。
八、计算下面算法的时间复杂度记为: O(n 2) 。
for (i =1;i<n; i++){ y=y+1; for (j =0;j <=2n ;j++ ) x ++; }九、计算机求解问题的步骤:问题分析、数学模型成立、算法设计与选择、算法表示、算法分析、算法实现、程序调试、结果整理文档编制。
10、算法是指解决问题的 方式或进程 。
二、简答题:1、依照时间复杂度从低到高排列:O( 4n 2)、O( logn)、O( 3n )、O( 20n)、O( 2)、O( n 2/3), O( n!)应该排在哪一名?答:O( 2),O( logn),O( n 2/3),O( 20n),O( 4n 2),O( 3n),O( n!)2、什么是算法?算法的特征有哪些?答:1)算法:指在解决问题时,依照某种机械步骤必然可以取得问题结果的处置进程。
通俗讲,算法:就是解决问题的方式或进程。
2)特征:1)算法有零个或多个输入;2)算法有一个或多个输出; 3)肯定性 ; 4)有穷性3、给出算法的概念?何谓算法的复杂性? 计算下例在最坏情况下的时间复杂性?for(j=1;j<=n;j++) (1)for(i=1;i<=n;i++) (2) {c[i][j]=0; (3) for(k=1;k<=n;k++) (4) c[i][j]= c[i][j]+a[i][k]*b[k][j]; } (5)答:1)概念:指在解决问题时,依照某种机械步骤必然可以取得问题结果的处置进程。
《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期: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; }
《算法设计与分析》(全)

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
初始条件与递归方程是递归函数的二个要素
算法分析设计期末复习

通过解递归方程
logm n1
T (n) nlogm k k j f (n / m j ) j0
学习要点: 理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。 (1)二分搜索技术; (2)大整数乘法; (3)Strassen矩阵乘法; (4)棋盘覆盖; (5)合并排序和快速排序; (6)线性时间选择; (7)最接近点对问题; (8)循环赛日程表。
基本运算Oi的执行次数ei分别进行统计分析。 – T(N,I)还需进一步简化,只在某些有代表性的合法输
入中去统计相应的ei来评价其复杂性。 – 一般只考虑三种情况下的时间性:最坏情况、最好
情况和平均情况下的复杂性,分别记为Tmax(N)、 Tmin(N)和Tavg(N)
四种渐近意义下的符号
• 四种渐近意义下的符号 –O –Ω –θ –o
}
----------------------------------------------------------------------------------------
CheckNum( T , p , q , element): ▹计算T[p..q]中element出现的次数
{ cnt ← 0
• 思路二:直接统计各 元素出现的次数,用 某一线性数据结构 存储统计结果(例如 用一个辅助数组存 储统计结果,统计时 用数组下标对应相 应元素)
第三章:动态规划
动态规划算法的基本思想
• 动态规划算法的基本思想
– 其基本思想与分治算法的思想类似——分而治之 – 与分治法的不同之处
• 分解后的子问题往往不互相独立; • 采用记录表的方法来保存所有已解决问题的答案
考虑时间 资源
算法之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)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4
常见的递归形式
• 除基本的递归形式外,其它常见的递归 形式有四种,它们是: • 多变元递归; • 多步递归; • 嵌套递归; • 联立递归
5
多变元递归
•• 多例变2:元整递数归划就分是问递题归:元将多一于个一正个整的数递n归表。示为 一系列正整数之和, n = n1 + n2 +…+nk 其中n1≥n2≥…≥nk≥1, k≥1。
• 正 例整 如ρ数(6n)的=一11个,这即种整表数示6的称划为分正数整为数1n1的种一:个 划6, 分。5+正1, 整4数+2n,的4+不1+同1的, 划3+分3,的3+个2+数1,成3+为1正+1整+1 数2+n2的+2划, 2分+2数+1,+1记, 2作+1ρ+(n1)+。1+1, 1+1+1+1+1+1
其中Q也不包含P,B为递归终止条件。
3
递归元
• 递归算法的思想是将对较大规模的对象的操作 归结为对较小规模的对象实施同样的操作。
• 这种规模的变化就体现在递归算法的变元中的 一类(一个或几个)变元上,这类变元被称之为 递归元。
• 递归元的变化是在递归定义中确定的,它的变 化应能导致递归算法的终止。
13
递归小结
解决方法:在递归算法中消除递归调用,使其转化为 非递归算法。 1、采用一个用户定义的栈来模拟系统的递归调用工作 栈。该方法通用性强,但本质上还是递归,只不过人 工做了本来由编译器做的事情,优化效果不明显。 2、用递推来实现递归函数。 3、通过变换能将一些递归转化为尾递归,从而迭代求 出结果。
6
正整数的划分
• 有时候,问题本身具有比较明显的递归 关系,因而容易用递归函数直接求解。
• 在本例中,如果设p(n)为正整数n的划分 数,则难以直接找到递归关系。
7
正整数的划分
• 因此考虑增加一个自变量:在正整数的所有
不同划分中,将最大加数n1不大于m的划分个 数记为q(n, m),可以建立如下的二递元归递关归系函:数:
后两种方法在时空复杂度上均有较大改善,但其适 用范围有限。
14
分治法
15
算法总体思想
• •对小到将 子这,问要问k则题个求题再规子解。划模问的分足题较为够分大k小别个规,求子模很解问的容。题问易如,题求果如分出子此割其问递成解题归k为个的的止更规进。小模行规仍下模然去的不,够直
T(n)
=n
T(n/2)
2
递归的概念
• 简单地说,递归就是用自己来定义自己。递归 算法是一个直接或间接地调用自己的算法。
• 一般地说,一个递归过程P可以表示为基语句 S(不含P)和P自身的组合β:
P β(S, P)
• 这样的表示包含了过程不终止的可能,因此递 归算法应更准确地表述为
P if B then Q else β(S, P)
• i最nt简q(单int情n,形i1n:t m(1)) q(n, 1)=1,q(1, mn )==11或n, m≥=11;
• •
{递 产q(iin归 生ff,((mnn关 的)=<系 新==1)情:1q1)||况(|((+|nm2(,:)qmm<(qn–=(1,n1=)n,)–+n11))q)(=rrnee–1ttumu+rrn,nqm0(1n;);, nnn>–≤1m)m,>n1>1;
n+2
n >= 2, m=0
A(A(n-1, m), m-1) n, m >= 1
Ackermann函数是一个双重的递归函数。
10
联立递归
• 联立递归是同时定义几个函数,它们彼 此相互调用,从而形成递归,又称间接 递归。
11
递归方法小结
• 递归方法是将复杂的问题分解为一些较为简单 的子问题的组合。这些子问题均与其相应的原 问题相同。
T(n/2)
T(n/2)
T(n/2)
16
算法总体思想
• 对将这求k出个的子小问规题模分的别问求题解的。解如合果并子为问一题个的更规大模规仍模然的不问够 小题,的则解再,划自分底为向k上个逐子步问求题出,原如来此问递题归的的解进。行下去,直 到问题规模足够小,很容易求出其解为止。
第二章
递归与分治策略
1
Hanoi塔问题
• 例Ha1n:oi塔Ha的no解i塔可问以题很:自有然A地、看B、成C这三样根一柱个子过。程A: 上有n个圆盘,自下而上由大到小地叠在一起。
(个(11(12个)3现盘(圆不压(个盘)先13)再最盘))盘移要 移 盘 允 在将每 圆将后移移至将 到 ; 许 较A盘次A将至上C至上将 小AB(只只。C2B面B上剩上)上。较 的。任能能n下,的的–大圆何移在1的n并全的盘–时动A要部、圆上于v刻一o求圆是iB盘;d都个、:可H{}a得nio到fi((如HMHinnAaato>下nnnv0ooe,的)ii(i((Fn{nn程tr––oF序11,,,rBT,A:Foirns)os;t,,TTAoos,,si,FnCTrtooA));}s) C三个柱子间移动。
• 例如Fibonacci函数:
1
n=0
F(n) = 1
n=1
F(n–1) + F(n–2) n > 1
Fibonacci函数是一个两步的递归函数。
9
嵌套递归
• 所谓嵌套递归是指递归调用中又含有递归调用, 又称为多重递归。
• 例如Ackermann函数:
2
n=1, m=0
A(n, m) = 1
m>= 0, n = 0
• (3i)f(qn(n<, m) r=etqu(rnn, qm(–n,1n) )+; q(n–m, m), n>m>1 • (4ir)feqt(u(nnrn=, =mq()mn=,)mq(–rn1e,t)un+r)n,q1n(n<+–mmq(,。nm, n);–1);
}
8
多步递归
• 若递归函数f(x, y),其中y是递归元,不仅与 f(x, y–1)有关,而且与f(x, y–2),……,乃至 f(x, 0)有关,则称为多步递归。
• 递归算法一定要有一个或几个最简单情况的计 算(非递归分支),如果缺少将造成递归不终止。
• 递归算法是有层次的,低层子问题的解组合成 高层问题的解。各层之间最好通过参数传递来 交流信息,如使用全局量,则要注意全局量的 及时修而且容易用 数学归纳法来证明算法的正确性,因此它 为设计算法、调试程序带来很大方便。 缺点:递归算法的运行效率较低,无论是 耗费的计算时间还是占用的存储空间都比 非递归算法要多。