计算机算法设计与分析(第4版)[王晓东][电子教案]

上传人:宝路 文档编号:48119618 上传时间:2018-07-10 格式:PPT 页数:54 大小:487.96KB
返回 下载 相关 举报
计算机算法设计与分析(第4版)[王晓东][电子教案]_第1页
第1页 / 共54页
计算机算法设计与分析(第4版)[王晓东][电子教案]_第2页
第2页 / 共54页
计算机算法设计与分析(第4版)[王晓东][电子教案]_第3页
第3页 / 共54页
计算机算法设计与分析(第4版)[王晓东][电子教案]_第4页
第4页 / 共54页
计算机算法设计与分析(第4版)[王晓东][电子教案]_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《计算机算法设计与分析(第4版)[王晓东][电子教案]》由会员分享,可在线阅读,更多相关《计算机算法设计与分析(第4版)[王晓东][电子教案](54页珍藏版)》请在金锄头文库上搜索。

1、第第2 2章章 递归与分治策略递归与分治策略学习要点:理解递归的概念。掌握设计有效算法的分治策略。通过下面的范例学习分治策略设计技巧。(1)二分搜索技术; (2)大整数乘法;(3)Strassen矩阵乘法;(4)棋盘覆盖;(5)合并排序和快速排序;(6)线性时间选择;(7)最接近点对问题;(8)循环赛日程表。n将要求解的较大规模的问题分割成k个更小规模的子问 题。算法总体思想算法总体思想nT(n/2)T(n/2)T(n/2)T(n/2)T(n)=n对这k个子问题分别求解。如果子问题的规模仍然不够 小,则再划分为k个子问题,如此递归的进行下去,直 到问题规模足够小,很容易求出其解为止。算法总体思

2、想算法总体思想n对这k个子问题分别求解。如果子问题的规模仍然不够 小,则再划分为k个子问题,如此递归的进行下去,直 到问题规模足够小,很容易求出其解为止。nT(n)=n/2T(n/4)T(n/4)T(n/4)T(n/4)n/2T(n/4)T(n/4)T(n/4)T(n/4)n/2T(n/4)T(n/4)T(n/4)T(n/4)n/2T(n/4)T(n/4)T(n/4)T(n/4)n将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。算法总体思想算法总体思想n将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。nT(n)=n/2

3、T(n/4)T(n/4)T(n/4)T(n/4)n/2T(n/4)T(n/4)T(n/4)T(n/4)n/2T(n/4)T(n/4)T(n/4)T(n/4)n/2T(n/4)T(n/4)T(n/4)T(n/4)算法总体思想算法总体思想n将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。nT(n)=n/2T(n/4)T(n/4)T(n/4)T(n/4)n/2T(n/4)T(n/4)T(n/4)T(n/4)n/2T(n/4)T(n/4)T(n/4)T(n/4)n/2T(n/4)T(n/4)T(n/4)T(n/4)分治法的设计思想是,将一个难以直接解决的大问题,

4、分割成一些规模较小的相同问题,以便各个击破, 分而治之。2.1 递归的概念递归的概念n直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。n由分治法产生的子问题往往是原问题的较小模 式,这就为使用递归技术提供了方便。在这种 情况下,反复应用分治手段,可以使子问题与 原问题类型一致而其规模却不断缩小,最终使 子问题缩小到很容易直接求出其解。这自然导 致递归过程的产生。n分治与递归像一对孪生兄弟,经常同时应用在 算法设计之中,并由此产生许多高效算法。 下面来看几个实例。2.1 递归的概念递归的概念例1 阶乘函数阶乘函数可递归地定义为:边界条件递归方程边界条件与递归方程是

5、递归函数的二个要素,递归函 数只有具备了这两个要素,才能在有限次计算后得出 结果。2.1 递归的概念递归的概念例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,称为 Fibonacci数列。它可以递归地定义为: 边界条件递归方程 第n个Fibonacci数可递归地计算如下: int fibonacci(int n)if (n 1时,perm(R)由(r1)perm(R1),(r2)perm(R2), (rn)perm(Rn)构成。 2.1 递归的概念递归的概念例5 整数划分问题 将正整数n表示成一系列正整数之和:n=n1+n2+nk, 其中n1n2nk1,k

6、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) q(n,m)=q(n,n),mn; 最大加数n1实际上不能大于n。因此,q(1,m)=1。(1) q(n,1)=1,n1; 当最大加数n1不大于1时,任何正整数n只有一种划分形式, 即(4) q(n,m)=q(n,m-1)+q(n-m,m),nm1; 正整数n的最大加数n1不大于m的划分由n1=m的划分和 n1n-1 的划分组成。(3) q

7、(n,n)=1+q(n,n-1); 正整数n的划分由n1=n的划分和n1n-1的划分组成。2.1 递归的概念递归的概念例5 整数划分问题 前面的几个例子中,问题本身都具有比较明显的递归关系,因 而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关 系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个 数记作q(n,m)。可以建立q(n,m)的如下递归关系。2.1 递归的概念递归的概念例5 整数划分问题 前面的几个例子中,问题本身都具有比较明显的递归关系,因 而容易用递归函数直接求解。 在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关 系,因

8、此考虑增加一个自变量:将最大加数n1不大于m的划分个 数记作q(n,m)。可以建立q(n,m)的如下递归关系。正整数n的划分数p(n)=q(n,n)。 2.1 递归的概念递归的概念例6 Hanoi塔问题 设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这 些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号 为1,2,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍 按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 规则1:每次只能移动1个圆盘; 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则3:在满足移动规则1和2的前提下,可将圆盘移至a,b,c中 任一塔座上

9、。在问题规模较大时,较难找到一般的方法,因此我们尝试 用递归技术来解决这个问题。当n=1时,问题比较简单。此时,只要将编号为1的圆盘从塔座a直 接移至塔座b上即可。 当n1时,需要利用塔座c作为辅助塔座。此时若能设法将n-1个 较小的圆盘依照移动规则从塔座a移至塔座c,然后,将剩下的最 大圆盘从塔座a移至塔座b,最后,再设法将n-1个较小的圆盘依照 移动规则从塔座c移至塔座b。 由此可见,n个圆盘的移动问题可分为2次n-1个圆盘的移动问题, 这又可以递归地用上述方法来做。由此可以设计出解Hanoi塔问题 的递归算法如下。2.1 递归的概念递归的概念例6 Hanoi塔问题void hanoi(i

10、nt 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);递归小结递归小结优点:结构清晰,可读性强,而且容易用 数学归纳法来证明算法的正确性,因此它 为设计算法、调试程序带来很大方便。缺点:递归算法的运行效率较低,无论是 耗费的计算时间还是占用的存储空间都比 非递归算法要多。解决方法:在递归算法中消除递归调用,使其 转化为非递归算法。 1、采用一个用户定义的栈来模拟系统的递归调 用工作栈。该方法通用性强,但本质上还是递 归,只不过人工做了本来由编译器做的事情, 优化效果不明显。 2、用

11、递推来实现递归函数。 3、通过变换能将一些递归转化为尾递归,从而 迭代求出结果。后两种方法在时空复杂度上均有较大改善 ,但其适用范围有限。递归小结递归小结分治法的适用条件分治法的适用条件分治法所能解决的问题一般具有以下几个特征:分治法所能解决的问题一般具有以下几个特征:n该问题的规模缩小到一定的程度就可以容易地解决;n该问题可以分解为若干个规模较小的相同问题,即该 问题具有最优子结构性质n利用该问题分解出的子问题的解可以合并为该问题的 解;n该问题所分解出的各个子问题是相互独立的,即子问 题之间不包含公共的子问题。 因为问题的计算复杂性一般是随着问题规模的增加 而增加,因此大部分问题满足这个特

12、征。这条特征是应用分治法的前提,它也是大多数问题 可以满足的,此特征反映了递归思想的应用能否利用分治法完全取决于问题是否具有这条特征 ,如果具备了前两条特征,而不具备第三条特征, 则可以考虑贪心算法或动态规划。这条特征涉及到分治法的效率,如果各子问题是不 独立的,则分治法要做许多不必要的工作,重复地 解公共的子问题,此时虽然也可用分治法,但一般 用动态规划较好。divide-and-conquer(P)if ( | P | ai,同理我们只要在amid 的后面查找x即可。无论是在前面还是后面查找x,其方法都 和在a中查找x一样,只不过是查找的规模缩小了。这就说明 了此问题满足分治法的第二个和第

13、三个适用条件。分析:很显然此问题分解出的子问题相互独立,即在ai的前 面或后面查找x是独立的子问题,因此满足分治法的第四个适 用条件。二分搜索技术二分搜索技术 给定已按升序排好序的n个元素a0:n-1,现要在这n个元素中找 出一特定元素x。 分析:该问题的规模缩小到一定的程度就可以容易地解决;该问题可以分解为若干个规模较小的相同问题;分解出的子问题的解可以合并为原问题的解;分解出的各个子问题是相互独立的。 二分搜索技术二分搜索技术 给定已按升序排好序的n个元素a0:n-1,现要在这n个元素中找 出一特定元素x。据此容易设计出二分搜索算法: template int BinarySearch(T

14、ype a, const Typeif (x = am) return m;if (x 0时,将2k2k棋盘分割为4个2k-12k-1 子棋盘(a)所示。 特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特 殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可 以用一个L型骨牌覆盖这3个较小棋盘的会合处,如 (b)所示, 从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用 这种分割,直至棋盘简化为棋盘11。 棋盘覆盖棋盘覆盖void chessBoard(int tr, int tc, int dr, int dc, int size)if (size = 1) return;

15、int t = tile+, / L型骨牌号s = size/2; / 分割棋盘/ 覆盖左上角子棋盘if (dr = tc + s)/ 特殊方格在此棋盘中chessBoard(tr, tc+s, dr, dc, s);else / 此棋盘中无特殊方格/ 用 t 号L型骨牌覆盖左下角boardtr + s - 1tc + s = t;/ 覆盖其余方格chessBoard(tr, tc+s, tr+s-1, tc+s, s);/ 覆盖左下角子棋盘if (dr = tr + s else / 用 t 号L型骨牌覆盖左上角boardtr + stc + s = t;/ 覆盖其余方格chessBoard

16、(tr+s, tc+s, tr+s, tc+s, s);复杂度分析T(n)=O(4k) 渐进意义下的最优算法合并排序合并排序基本思想:将待排序元素分成大小大致相同的2个子集合,分 别对2个子集合进行排序,最终将排好序的子集合合并成为所 要求的排好序的集合。 void MergeSort(Type a, int left, int right)if (leftvoid QuickSort (Type a, int p, int r)if (p int Partition (Type a, int p, int r) int i = p, j = r + 1; Type x=ap;/ 将 x的元素交换到右边区域while (true) while (a+i x);if (i = j) break; Swap(ai, aj);a

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号