(算法分析设计)第2章递归与分治策略课件.ppt
《(算法分析设计)第2章递归与分治策略课件.ppt》由会员分享,可在线阅读,更多相关《(算法分析设计)第2章递归与分治策略课件.ppt(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第2章 递归与分治策略第2章 递归与分治策略学习要点学习要点:n理解递归的概念。n掌握设计有效算法的分治策略。n通过下面的范例学习分治策略设计技巧。(1)二分搜索技术;(2)大整数乘法;(3)Strassen矩阵乘法;(4)合并排序(5)快速排序;(6)线性时间选择;学习要点:n将要求解的较大规模的问题分割成k个更小规模的子问题。算法总体思想nT(n/2)T(n/2)T(n/2)T(n/2)T(n/2)T(n/2)T(n/2)T(n/2)T(n)=n对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。将要求解的较
2、大规模的问题分割成k个更小规模的子问题。算法总体(算法分析设计)第2章递归与分治策略课件(算法分析设计)第2章递归与分治策略课件2.1 递归的概念n直接或间接地调用自身的算法称为递归算法递归算法。用函数自身给出定义的函数称为递归函数递归函数。n由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子子问题与与原原问题类型一致而其型一致而其规模却不断模却不断缩小小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。n分治与递归像一对孪生兄弟,经常同时应用。2.1 递归的概念直接或间接地调用自身的算法称为递归算法。2.1 递归
3、的概念例例1 1 阶乘函数阶乘函数 非递归定义:非递归定义:n n!=n*(n-1)*(n-2)*1=n*(n-1)*(n-2)*1 阶乘函数可递归地定义为:边界条件边界条件递归方程递归方程边界条件与递归方程是递归函数的二个要素。2.1 递归的概念例1 阶乘函数边界条件递归方程边界条件n递归算法:int recur(int n)if(n=1)return 1;return n*recur(n-1);递归出口递归出口递归调用递归调用递归算法:递归出口递归调用2.1 递归的概念例例2 Fibonacci2 Fibonacci数列数列无穷数列1,1,2,3,5,8,13,21,34,55,称为Fib
4、onacci数列。它可以递归地定义为:边界条件边界条件递归方程递归方程第n个Fibonacci数可递归地计算如下:int fibonacci(int n)if(n 0)hanoi(n-1,a,c,b);move(a,b);hanoi(n-1,c,b,a);表示以塔座b为辅助塔座,将塔座上自下而上,由大到小叠在一起的-1个圆盘按规则移至塔座上并按同样顺序叠放。将塔座a上的圆盘移动到塔座b上去void hanoi(int n,int a,int bHanoi塔问题的复杂性分析n=1移动次数()n移动次数()n移动次数()n移动次数()n当时当时移动次数()?移动次数()?Hanoi塔问题的复杂性分
5、析=1递归小结优点:优点:结构清晰,可构清晰,可读性性强,而且容易用,而且容易用数学数学归纳法来法来证明算法的正确性,因此它明算法的正确性,因此它为设计算法、算法、调试程序程序带来很大方便。来很大方便。缺点:缺点:递归算法的运行效率算法的运行效率较低,无低,无论是是耗耗费的的计算算时间还是占用的存是占用的存储空空间都比都比非非递归算法要多。算法要多。递归小结优点:结构清晰,可读性强,而且容易用数学归纳法来证明n求Fibonacci数时有很多重复工作:求Fibonacci数时有很多重复工作:解决方法:解决方法:在在递归算法中消除算法中消除递归调用,使其用,使其转化化为非非递归算法。算法。1、采用
6、一个、采用一个用用户定定义的的栈来模来模拟系系统的的递归调用工作用工作栈。该方法方法通用性通用性强,但本,但本质上上还是是递归,只不,只不过人工做了本来由人工做了本来由编译器做的事情,器做的事情,优化效果不明化效果不明显。2、用、用递推推来来实现递归函数。函数。3、通、通过变换能能将一些将一些递归转化化为尾尾递归,从而,从而迭代求出迭代求出结果。果。后两种方法在后两种方法在时空复空复杂度上均有度上均有较大改善,大改善,但其适用范但其适用范围有限有限。递归小结解决方法:在递归算法中消除递归调用,使其转化为非递归算法。递分治法的基本思想n分治法的基本思想分治法的基本思想将一个规模为n的问题分解为a
7、个规模较小的子问题,这些子问题互相独立并且与原问题相同。通过递归地求解这些子问题,然后再将各个子问题的解合并,就可以实现对原问题的求解。分治法的基本思想分治法的基本思想分治法的求解过程分治法的求解过程分治法的求解过程n分解分解(divide):将原问题分解为一系列子问题;:将原问题分解为一系列子问题;n递归求解递归求解(conquer):递归求解各个子问题。若:递归求解各个子问题。若子问题足够小,则直接求解。子问题足够小,则直接求解。n合并合并(merge):将子问题结果合并成原问题的解:将子问题结果合并成原问题的解说明:某些问题不需要说明:某些问题不需要合并合并,比如二分搜索,比如二分搜索问
8、题问题分治法的求解过程分治法的求解过程divide-and-conquer(P)if(|P|=n0)adhoc(P);divide P into smaller subinstances P1,P2,Pa;for(i=1,i=a,i+)yi=divide-and-conquer(Pi);return merge(y1,y2,ya);|P|:问题P的规模;adhoc:分治法中的基本子运算n0:阀值如果问题P的规模不超过n0,说明问题已经容易求解,不要再继续分解。利用adhoc(P)直接求解。分治法的设计模式divide-and-conquer(P)|P|:问题P的规分治法的分割原则n分治法的分割
9、原则分治法的分割原则实践实践表明:将一个问题划分成数据规模大小相数据规模大小相等的等的a个子问题个子问题的处理方法行之有效;分治法的分割原则分治法的分割原则分治法的计算效率分析n分治法的计算效率分析分治法的计算效率分析通常用递归方程来进行分析通常用递归方程来进行分析分治法将规模为n的问题分成a个规模为n/b的子问题n设分解阈值n0=1,且adhoc解规模为1的问题耗费1个单位时间n设将原问题分解为a个子问题以及用merge将a个子问题的解合并为原问题解需要使用f(n)个单位时间。n用T(n)表示该分治法divide-and-merge(P)解规模为|P|=n的问题所需要的计算时间分治法的计算效
10、率分析分治法的计算效率分析(算法分析设计)第2章递归与分治策略课件g(n)函数函数g(n)函数g(n)函数g(n)函数T(n)函数g(n)函数g(n)函数T(n)函数主方法(详见算法导论)根据这两项对结果的影响不同,分成三种情况讨论主方法(详见算法导论)根据这两项对结果的影响不同,分成三(算法分析设计)第2章递归与分治策略课件因为问题的计算复杂性一般是随着问题规模的增加而增加,因此大部分问题满足这个特征。这条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用能否利用分治法完全取决于问题是否具有这条特征,如果具备了前两条特征,而不具备第三条特征,则可以考虑贪心算法贪心
11、算法或动态规划动态规划。这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划动态规划较好。分治法的适用条件分治法所能解决的问题一般具有以下几个特征:分治法所能解决的问题一般具有以下几个特征:分治法所能解决的问题一般具有以下几个特征:分治法所能解决的问题一般具有以下几个特征:n该问题的的规模模缩小到一定的程度就可以容易地解决;小到一定的程度就可以容易地解决;n该问题可以分解可以分解为若干个若干个规模模较小的相同小的相同问题,即,即该问题具有具有最优子结构性质最优子结构性质n利用利用该问题分解出的子分解出的子
12、问题的解可以合并的解可以合并为该问题的的解;解;n该问题所分解出的各个子所分解出的各个子问题是是相互独立相互独立的,即子的,即子问题之之间不包含公共的子不包含公共的子问题。因为问题的计算复杂性一般是随着问题规模的增加而增加,因此大部n二分搜索技术n大整数的乘法nStrassen矩阵乘法n合并排序n快速排序n线性时间选择二分搜索技术二分搜索技术二分搜索技术二分搜索技术分析:如果n=1即只有一个元素,则只要比较这个元素和x就可以确定x是否在表中。因此这个问题满足分治法的第一个适用条件分析:比较x和a的中间元素amid,若x=amid,则x在L中的位置就是mid;如果xai,同理我们只要在amid的
13、后面查找x即可。无论是在前面还是后面查找x,其方法都和在a中查找x一样,只不过是查找的规模缩小了。这就说明了此问题满足分治法的第二个和第三个适用条件。分析:很显然此问题分解出的子问题相互独立,即在ai的前面或后面查找x是独立的子问题,因此满足分治法的第四个适用条件。二分搜索技术给定已按升序定已按升序排好序排好序的的n个元素个元素a0:n-1,现要在要在这n个元素中找个元素中找出一特定元素出一特定元素x。分析:分析:该问题的的规模模缩小到一定的程度就可以容易地解决;小到一定的程度就可以容易地解决;该问题可以分解可以分解为若干个若干个规模模较小的相同小的相同问题;分解出的子分解出的子问题的解可以合
14、并的解可以合并为原原问题的解;的解;分解出的各个子分解出的各个子问题是相互独立的。是相互独立的。分析:如果n=1即只有一个元素,则只要比较这个元素和x就可以n逐个地扫描数组a中每个元素,直到找到x为止。在含有n个元素的线性表中查找一个元素在最坏情况下都需要进行n次比较,其时间复杂度为O(n)。n利用分治法分治法求解此问题,求解过程是:将n个元素分分成个数大致相等彼此独立的两半部分,分,即an/2的前面或后面两个子问题;将第n/2位置的元素与x进行比较,如果相等,则找到x,算法结束。如果xan/2,则在数组a的后半部分分继续搜索搜索x;如果xan/2,则在数组a的前半部分分继续搜索搜索x。逐个地
15、扫描数组a中每个元素,直到找到x为止。二分搜索技术给定已按升序排好序的定已按升序排好序的n个元素个元素a0:n-1,现要在要在这n个元素中找个元素中找出一特定元素出一特定元素x。据此容易设计出二分搜索算法二分搜索算法:template int BinarySearch(Type a,const Type&x,int l,int r)while(r=l)int m=(l+r)/2;if(x=am)return m;if(x am)r=m-1;else l=m+1;return-1;算法复杂度分析:算法复杂度分析:每执行一次算法的while循环,待搜索数组的大小减少一半。因此,在最坏情况下,whi
16、le循环被执行了O(logn)次。循环体内运算需要O(1)时间,因此整个算法在最坏情况下的计算时间复杂性为O(logn)。二分搜索技术给定已按升序排好序的n个元素a0:n-1,现大整数的乘法大整数的乘法大整数的乘法大整数的乘法n大整数的乘法大整数的乘法问题描述n需要处理的整数超过了计算机硬件能直接处理的整数范围n浮点数计算对精度的影响解决方案n利用软件方法来实现大整数的乘法典型应用nRSA密码体系大整数的乘法大整数的乘法 n传统做法:需要做n*n次1位整数乘法操作,n-1次移位操作,n-1次加法操作时间复杂度为O(n2)传统做法:n/2位n/2位ABX=n/2位n/2位CDY=大整数大整数X和
17、和Y的分段的分段X、Y为两个为两个n位的二进制整数位的二进制整数n/2位n/2位ABX=n/2位n/2位CDY=大整数X和YXY的乘积形式(1/2)形式一:形式一:包括:包括:4次次n/2位整数的乘法位整数的乘法3次不超过次不超过2n位的整数加法位的整数加法2次移位次移位XY的乘积形式(1/2)形式一:包括:所有加法和移位共用所有加法和移位共用O(n)步运算步运算设设T(n)是是2个个n位整数相乘所需的运算总数位整数相乘所需的运算总数所有加法和移位共用O(n)步运算XY的乘积形式(2/2)形式二:形式二:包括:包括:3次次n/2位整数的乘法位整数的乘法6次整数加、减法次整数加、减法2次移位次移
18、位XY的乘积形式(2/2)形式二:包括:p如果将大整数分成更多段,用更复杂的方式把它们组合起来,将有可能得到更优的算法。p最终的,这个思想导致了快速傅利叶变换快速傅利叶变换(Fast Fourier Transform)的产生。该方法也可以看作是一个复杂的分治算法,对于大整数乘法,它能在O(nlogn)时间内解决。p是否能找到线性时间的算法?目前为止还没有结果。如果将大整数分成更多段,用更复杂的方式把它们组合起来,将有可StrassenStrassen矩阵乘法矩阵乘法Strassen矩阵乘法矩阵的乘法:矩阵的乘法:矩阵的乘法:(算法分析设计)第2章递归与分治策略课件Strassen矩阵乘法使用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分析 设计 递归 分治 策略 课件
限制150内