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

递归和分治法摘要:1.递归和分治法的定义2.递归和分治法的区别3.递归和分治法的应用实例4.递归和分治法的优缺点正文:递归和分治法是计算机科学中常用的两种算法设计技巧。
它们在解决问题时都采用了将问题分解成更小子问题的思路,但在具体实现上却有所不同。
下面,我们来详细了解一下递归和分治法。
1.递归和分治法的定义递归法是指在算法中调用自身来解决问题的方法。
递归函数在执行过程中,会将原问题分解成规模更小的相似子问题,然后通过调用自身的方式,解决这些子问题,最后将子问题的解合并,得到原问题的解。
分治法是指将一个大问题分解成若干个规模较小的相似子问题,然后分别解决这些子问题,最后将子问题的解合并,得到原问题的解。
分治法在解决问题时,通常需要设计一个主函数(master function)和一个子函数(subfunction)。
主函数负责将问题分解,子函数负责解决子问题。
2.递归和分治法的区别递归法和分治法在解决问题时都采用了将问题分解成更小子问题的思路,但它们在实现上存在以下区别:(1)函数调用方式不同:递归法是通过调用自身来解决问题,而分治法是通过调用不同的子函数来解决问题。
(2)递归法必须有递归出口,即必须有一个基线条件,而分治法不一定需要。
3.递归和分治法的应用实例递归法应用广泛,例如斐波那契数列、汉诺塔问题、八皇后问题等。
分治法也有很多实际应用,例如快速排序、归并排序、大整数乘法等。
4.递归和分治法的优缺点递归法的优点是代码简单易懂,但缺点是容易产生大量的重复计算,导致时间复杂度较高。
分治法的优点是时间复杂度较低,但缺点是代码实现相对复杂,需要设计主函数和子函数。
总之,递归和分治法都是解决问题的有效方法,具体应用需要根据问题的特点来选择。
算法之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)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。
第2章 递归与分治(1)

本例若设p(n)为正整数n的划分数,则难以找到递 归关系。
17
现考虑增加一个自变量:将最大加数n1不大于m的划 分个数记作q(n,m)。q(n,m)有如下递归关系:
(1) q(n,1)=1,n1; 当最大加数n1不大于1时,任何正整数n只有一种划分形式, 即
• (8)循环赛日程表。
2
算法总体思想
对这k个子问题分别求解。如果子问题的规模仍然不够 将小要,求则解再的划较分大为k规个模子的问问题题,分如割此成递k归个的更进小行规下模去的,子直问
题到。问题规模足够小,很容易求出其解为止。
T(n)
=n
T(n/2)
T(n/2)
T(n/2)
T(n/2)
3
算法总体思想
以想象的慢速度趋向正无穷大。
13
例4:排列问题
排设列计。一个递归算法生成n个元素{r1,r2,…,rn}的全 ➢设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R{ri}。 ➢集合X中元素的全排列记为perm(X)。 (permutation) ➢(ri)perm(X)表示在全排列perm(X)的每一个排列前 加上前缀得到的排列。
22
➢由此可见,n个圆盘的移动问题可分为2次n-1个圆 盘的移动问题,这又可以递归地用上述方法来做。
解Hanoi塔问题的递归算法如下:
void hanoi(int n, int a, int b, int c) { if (n > 0) { hanoi(n-1, a, c, b); move(a,b); hanoi(n-1, c, b, a); } }
n1,m1 nm nm
递归和分治法

递归和分治法摘要:一、递归和分治法简介1.递归2.分治法二、递归和分治法的应用1.递归在编程中的应用2.分治法在编程中的应用三、递归和分治法的优缺点1.递归的优缺点2.分治法的优缺点四、递归和分治法在实际问题中的应用案例1.递归在实际问题中的应用案例2.分治法在实际问题中的应用案例五、递归和分治法在我国教育领域的应用1.递归在我国教育领域的应用2.分治法在我国教育领域的应用六、递归和分治法在未来的发展前景1.递归在未来的发展前景2.分治法在未来的发展前景正文:递归和分治法是计算机科学中两种解决问题的方法,它们都具有广泛的应用。
递归是一种函数调用自身的技术,通常用于解决具有相似子问题的复杂问题。
分治法是一种将大问题分解成小问题,然后逐个解决小问题的方法,最后将小问题的解合并得到大问题的解。
递归在编程中有广泛的应用,例如计算阶乘、快速排序等。
递归的优点是可以简洁地表示复杂问题,但缺点是可能会导致栈溢出,因此需要合理设计递归函数。
分治法在编程中也有广泛的应用,例如归并排序、大整数乘法等。
分治法的优点是可以有效地处理大规模问题,但缺点是可能会导致过多的子问题,增加计算复杂度。
在实际问题中,递归和分治法都有许多应用案例。
例如,在图像处理中,快速傅里叶变换(FFT)算法利用了递归和分治法来高效地计算离散傅里叶变换。
在我国教育领域,递归和分治法被广泛应用于计算机科学教育,帮助学生理解和掌握基本的算法思想。
未来,递归和分治法仍将在计算机科学领域发挥重要作用。
随着科技的进步,递归和分治法将应用于更复杂的问题,如人工智能、大数据处理等领域。
第二章递归与分治

正整数的划分
在正整数的所有不同划分中,将最大加数n1不 大于m的划分个数记为q(n, m),可以建立如下 的递归关系: 的二元递归函数: n= 1 n, 或m m =1 q (n, m) { 1 (1) q(n, 1)=1, q(1, m) 最简单情形: =1 ≥1; q(n, m) = 1 + q(n, n –1) n ≤ m if (n < 1) || (m < 1) return 0; 递归关系: (2) q(n, n) = 1 + q(n, n–1),n>1; q(n, m– 1)+q(n –m, m) if (n == 1) || (m == 1) return 1; n>m>1 产生的新情况: if (n == 1) || (n < m) return 1 + q(n, n–1); return q(n, m –1) q(n m, } n>m>1 (3) q(n, m) =q (n, m+ –1) +–q (nm); –m, m), (4) q(n, m) = q(n, n),=n < mn) 。 整数 n的划分数 ρ(n) q (n, 。
2019/3/24 计算机算法设计与分析 3
Hanoi塔问题
例 Hanoi 1:Hanoi 塔的解可以很自然地看成这样一个过程: 塔问题:有A、B、C三根柱子。A
上有n个圆盘,自下而上由大到小地叠在一起。 于是可得到如下的程序: (1)先将A上面 现要将 A上的全部圆 n –1 个盘移至 C。 void Hanoi(int n, int Fr, int To, int As) { 盘移到B上,并要求: if (n > 0) { (2)再将 A上剩下 (1)每次只能移动一个 Hanoi(n–1, Fro, Ass, To); 的1 个盘移至 B。 圆盘; (2)任何时刻都 B C A Move(Fro, To); 不允许将较大的圆盘 Hanoi(n–1, Ass, To, Fro)} (3) 最后将C上的 压在较小的圆盘上; } n–(3) 1个盘移至 B。A、B、 圆盘只能在 C三个柱子间移动。
算法之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)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。
第2章递归与分治策略

说明:边界条件与递归方程是递归函数的两个要素, 递归函数只有具备了这两个要素,才能在有限次计
算后得出结果。
2024/7/30
算法设计与分析
4
递归函数的内部执行过程
递归函数内部执行过程如下:
(1)运行开始时,为递归调用建立一个工作栈,其结 构包括实参、局部变量和返回地址;
(2)每次执行递归调用之前,把递归函数的实参和局 部变量的当前值以及调用后的返回地址压栈;
• Ackerman函数A(n, m)定义如下,n, m是两个独 立的整变量,其中n, m均≥0:
A1,0 2
A0, m 1
An,0 n 2
An, m AAn 1, m, m 1
m0 n2 n, m 1
2024/7/30
算法设计与分析
8
分析
• A(n,m)的自变量m的每一个值都定义了一个单 变量函数:
– 将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
2024/7/30
算法设计与分析
25
原问题 的规模是n
子问题1 的规模是n/2
子问题2 的规模是n/2
子问题1的解
子问题2的解
原问题的解
2024/7/30
算法设计与分析
26
问题(N个输入)
合 子问题1 并 解
(3)每次递归调用结束后,将栈顶元素出栈,使相应 的实参和局部变量恢复为调用前的值,然后转向返回地 址指定的位置继续执行
举例2-2:Fibonacci数列
• 无穷数列1, 1, 2, 3, 5, 8, 13, 21, 34, 55,…,被称
为Fibonacci数列。 • 它可以递归定义为:
大学_计算机算法设计与分析第4版(王晓东著)课后答案下载

计算机算法设计与分析第4版(王晓东著)课后答
案下载
计算机算法设计与分析第4版内容简介
第1章算法概述
1.1 算法与程序
1.2 算法复杂性分析
1.3 NP完全性理论
算法分析题1
算法实现题1
第2章递归与分治策略
2.1 递归的概念
2.2 分治法的基本思想
2.3 二分搜索技术
2.4 大整数的乘法
2.5 Strassen矩阵乘法
2.6 棋盘覆盖
2.7 合并排序
2.8 快速排序
2.9 线性时间选择
2.10 最接近点对问题
第3章动态规划
第4章贪心算法
第5章回溯法
第6章分支限界法
第7章随机化算法
第8章线性规划与网络流
附录A C++概要
参考文献
计算机算法设计与分析第4版目录
本书是普通高等教育“十一五”__规划教材和国家精品课程教材。
全书以算法设计策略为知识单元,系统介绍计算机算法的设计方法与分析技巧。
主要内容包括:算法概述、递归与分治策略、动态规划、贪心算法、回溯法、分支限界法、__化算法、线性规划与网络流等。
书中既涉及经典与实用算法及实例分析,又包括算法热点领域追踪。
为突出教材的`可读性和可用性,章首增加了学习要点提示,章末配有难易适度的算法分析题和算法实现题;配套出版了《计算机算法设计与分析习题解答(第2版)》;并免费提供电子课件和教学服务。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
具体执行过程:求最大值
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)
• 考虑3个元素的集合,可划分为 – ① 1个子集的集合:{{1,2,3}} – ② 2个子集的集合:{{1,2},{3}},{{1,3},{2}}, {{2,3},{1}} – ③ 3个子集的集合:{{1},{2},{3}} ∴F(3,1)=1;F(3,2)=3;F(3,3)=1;
具体算法:伪代码
int MaxProfit(int p[], int m, int n) { //求第m到第n天内一次买卖股票的最大收益 int i=m, j=(m+n)/2+1; //在第i天买入股票,并在第j天卖出股票 int k; int max1, max2, max3; //三个可能的最优解 max1=MaxProfit(p, m, (m+n)/2); // S上的最优解 max2=MaxProfit(p, (m+n)/2+1, n); // S’上的最优解 for(k=m+1;k<=(m+n)/2;k++) //求最小p(i) if(p(i)>p(k)) p(i)=p(k); for(k=(m+n)/2+2;k<=n;k++) //求最大p(j) if(p(j)<p(k)) p(j)=p(k); max3=p(j)-p(i); return 最大值(max1, max2, max3); } //最优解
4 5 87 65 5 65
6 -9
0 1 2 4 3 24 -13 29 113 87
8 14
9 76
10 44
int MAXA( A, i, j) { int i, j, max=0, max1=0, max2=0; int A[]; if( i==j ) max=A[i]; else //求数组前半部分的最大值max1 { max1 = MAXA( A, i, (i+j)/2 ); //求数组后半部分的最大值max2 max2 = MAXA( A, (i+j)/2+1, j ); if( max1 > max2 ) max = max1; else max = max2; } return max; }
– 怎样在O(nlog2n)时间找到正确的i和j。
• 一共有n天的数据,即p(1), p(2), ……, p(i), p(i+1), ……, p(n1), p(n)。 • 设S是1天,……,n/2天的集合;S’是n/2+1,……,n天的集 合。
• 分治法策略:
– 或者有一个最优解使投资者在n/2结束时持有这只股票: 第i天买入股票,此时i≤n/2;第j天卖出股票,此时 j≥n/2+1。 – 或者没有: • 最优解在集合S中(i与j均≤n/2):用户可以在前n/2天 内买入股票并卖出; • 或者最优解在集合S’中( i与j均≥n/2+1):用户可以 在后n/2天内买入股票并卖出。
• 练习3:分析Strassen矩阵乘法在时间效率上有何 改进,为什么?
• Strassen矩阵乘积分治算法中,用了7次对于n/2阶 矩阵乘积的递归调用和18次n/2阶矩阵的加减运算。 由此可知,该算法的所需的计算时间T(n)满足如 下的递归方程: O1 n2
T n 2 7 T n / 2 O n
n2
T(n)=O(nlog7)≈O(n2.81)
较大的改进
课后练习
• 练习4:划出下列序列在快速排序过程中一次 划分的具体步骤。
21 25 49 25* 16 08
一次划分的过程
初始关键字
pivotkey 21 low 08 08 08 08 08 25 49 25* 16 08 high 21 high 25
c2 n (1 3 ( 3 ) 2 ( 3 )log4 n1 ) 4 4 4
• 最后一层叶子结点数: 3log4 n nlog4 3
16T(n/4) + n T(n) = T(3n/7) + 1 T(n) = 3T(n/4) + nlogn 定理(主定理): a≥1且b>1是常数, f(n)是一个函数,T(n)由 如下的递推式定义:T(n)=aT(n/b)+f(n),式中,n/b指n/b或 n/b,则T(n)有如下的渐近界: (1)若对于某常数є>0,有f(n)=O(nlogba-є),则T(n)=(nlogba); (2)若f(n)=(nlogba ),则T(n)=(nlogbalogn); (3)若对于某常数є>0,有f(n)=(nlogba+є ),且对于某个常数 c<1和所有足够大的n,有af(n/b)≤cf(n),则T(n)=(f(n))。
• 如果A[n/2]比A[n/2-1]和A[n/2+1]都大,顶峰项实际上就等 于A[n/2]。
具体算法:伪代码
int Danfeng(int A[], int m, int n) { //求单峰数组中的顶峰值 int k=(m+n)/2; if(k==m&&k==n) return A[k]; if(A[k-1]<A[k]&&A[k]>A[k+1]) return A[k]; else { if(A[k-1]<A[k]&&A[k]<A[k+1]) Danfeng(A[], k+1, n); if(A[k-1]>A[k]&&A[k]>A[k+1]) Danfeng(A[], m, k-1); } }
• 则算法是在下面三个可能的解中最好的: – S上的最优解 – S’上的最优解 – p(j)-p(i)的最大值,对所有的i∈S且j∈S’ • 前两个选择中的每一个在T(n/2)时间内被递归地计算;
• 第三个选择通过找S中的最小与S’中的最大而计算,该操 作需要O(n)时间。
• 则运行时间的递推关系式是: T ( n) 2T ( n ) O( n) 2 • 则算法的时间复杂度为:O(nlog2n)。
T(n) = 3T(n/4) + nlogn
• 练习2:分析如下时间函数的复杂度,并说明原因。
1. 利用递归树说明以下时间函数的复杂度:
O(1) T ( n) 3T ( n ) O( n) 4 n1 n1
• 递归树的高度为:log4n+1;
• 除去叶子结点,树有log4n层,每层结点总数为:
问题分析、举例说明
• 利用分治策略设计一个算法。
• 举例:
– 假设n=3, p(1)=9, p(2)=1, p(3)=5. 那么应该得出“2买,3 卖”的结论。即,在第2天买并且在第3天卖意味着每股 将挣4美元,是这个期间最大的收益。 • 问题分析: – 存在一个简单的算法,时间复杂度是O(n2):对所有的 买天/卖天构成的对进行尝试,看看哪个对能使用户挣 到最多的钱。 – 假设在第i天买、第j天卖可以获得最大收益:最优解。
课后练习(选做)
• 练习6:假设有n个项的数组A,每个项具有一个 不同的数。告诉你值A[1],A[2],…,A[n]的序列是单 峰的:对于某个在1与n之间的下标p,数组项的值 增加到A中的位置p,然后剩下的过程减少直到位 置 n。 • 要求:
– 利用分治策略设计一个算法,读尽可能少的元 素,找到这个“顶峰”元素p。
分治法思想
• 查看A[n/2]值,分析其是出现在上坡上( A[n/2]在A[p]之 前)还是下坡上(A[n/2]在A[p]之后)。 • 如果A[n/2-1]<A[n/2]<A[n/2+1],那么n/2项一定严格位 于p的前面,因此可以在n/2+1项到n项之间递归地继续下 去。 • 如果A[n/2-1]>A[n/2]>A[n/2+1],那么n/2项一定严格位 于p的后面,因此可以在1项到n/2-1项之间递归地继续下 去。
• 要求: