第2讲 分治策略
- 格式:pptx
- 大小:358.36 KB
- 文档页数:43
分治算法及其典型应用
分治算法是一种重要的算法设计策略,它将一个大问题分解成若干个规模较小的子问题,然后递归地解决这些子问题,最后将它们的解合并起来,得到原问题的解。
分治算法在计算机科学和算法设计中有着广泛的应用,可以解决许多实际问题,下面将介绍一些典型的应用。
1. 排序算法。
分治算法在排序算法中有着重要的应用。
其中最著名的就是归并排序和快速排序。
在归并排序中,算法将数组分成两个子数组,分别进行排序,然后合并这两个有序的子数组。
而在快速排序中,算法选择一个基准值,将数组分成两个子数组,分别小于和大于基准值,然后递归地对这两个子数组进行排序。
2. 搜索算法。
分治算法也可以用于搜索问题,例如二分搜索算法。
在这种算法中,将搜索区间分成两个子区间,然后递归地在其中一个子区间中进行搜索,直到找到目标元素或者子区间为空。
3. 求解最大子数组问题。
最大子数组问题是一个经典的动态规划问题,也可以用分治算法来解决。
算法将数组分成两个子数组,分别求解左右子数组的最大子数组,然后再考虑跨越中点的最大子数组,最后将这三种情况的最大值作为整个数组的最大子数组。
4. 矩阵乘法。
分治算法也可以用于矩阵乘法。
在矩阵乘法中,算法将两个矩阵分成四个子矩阵,然后递归地进行矩阵乘法,最后将四个子矩阵的结果合并成一个矩阵。
总的来说,分治算法是一种非常重要的算法设计策略,它在许多实际问题中有着广泛的应用。
通过将一个大问题分解成若干个规模较小的子问题,然后递归地解决这些子问题,最后将它们的解合并起来,我们可以高效地解决许多复杂的问题。
文库贡献者物理与电子信息工程学院信息工程系课程介绍2013年11月目录1. 《算法设计与分析》课程介绍 (1)2. 《离散数学》课程介绍 (2)3. 《计算机组成原理》课程介绍 (3)4. 《网络应用终端开发》课程介绍 (4)5. 《数据结构》课程介绍 (5)6. 《面向对象程序设计(Java)》课程介绍 (6)7. 《嵌入式操作系统基础》课程介绍 (8)8. 《数据结构》课程介绍 (9)9. 《操作系统A》课程介绍 (11)10. 《多媒体技术A》课程介绍 (12)11. 《ARM原理与应用》课程介绍 (13)12. 《ERP系统实施及二次开发技术》课程介绍 (14)13. 《Internet开发基础(JSP)》课程介绍 (15)14. 《IP统一通信技术》课程介绍 (17)15. 《IT项目管理》课程介绍 (18)16. 《嵌入式系统软件开发》课程介绍 (19)17. 《面向对象程序设计A》课程介绍 (20)18. 《Web应用开发》课程介绍 (22)19. 《Xml与Web Service》课程介绍 (24)20. 《编译原理》课程介绍 (26)21. 《数据库原理与应用》课程介绍 (27)22. 《电子商务概论》课程介绍 (28)23. 《企业运作模拟》课程介绍 (29)24. 《信息系统分析与设计》课程介绍 (31)25. 《管理学原理》课程介绍 (32)26. 《会计学原理》课程介绍 (34)27. 《数字电路与逻辑设计》课程介绍 (35)28. 《程序设计基础》课程介绍 (36)29. 《计算机网络》课程介绍 (38)30. 《计算机网络安全》课程介绍 (39)31. 《计算机网络规划与设计》课程介绍 (40)32. 《路由与交换技术》课程介绍 (41)33. 《企业管理与ERP》课程介绍 (43)34. 《软件工程B》课程介绍 (44)35. 《软件质量与测试基础》课程介绍 (45)36. 《网络协议分析与设计》课程介绍 (46)37. 《物流与供应链管理》课程介绍 (47)38. 《网络性能测试与分析》课程介绍 (48)39. 《信息系统分析与设计》课程介绍 (49)40. 《现代通信技术》课程介绍 (50)41. 《计算机网络基础》课程介绍 (51)42. 《计算机组成与体系结构》课程介绍 (53)43. 《运筹学B》课程介绍 (54)44. 《大型数据库系统基础》课程介绍 (55)1.《算法设计与分析》课程介绍2)教学目的和要求算法设计与分析是计算机科学与技术专业的专业课程,在计算机科学与应用的理论研究中具有重要的地位。
福建工程学院计算机与信息科学系实验报告2010 – 2011 学年第一学期任课老师:实验题目1.设计程序利用分治策略求n个数的最大值和最小值。
2.利用分治策略,在n个不同元素中找出第k个最小元素。
实验时间实验开始日期:报告提交日期:实验目的、要求一、算法设计技术当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。
对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。
如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。
这就是分治策略的基本思想。
下面通过实例加以说明。
【例】在n个元素中找出最大元素和最小元素。
我们可以把这n个元素放在一个数组中,用直接比较法求出。
算法如下:void maxmin1(int A[],int n,int *max,int *min){ int i;*min=*max=A[0];for(i=2;i < n;i++){ if(A[i] > *max) *max= A[i];if(A[i] < *min) *min= A[i];}}上面这个算法需比较2(n-1)次。
能否找到更好的算法呢?我们用分治策略来讨论。
把n个元素分成两组:A1={A[1],...,A[int(n/2)]}和A2={A[int(N/2)+1],...,A[N]}分别求这两组的最大值和最小值,然后分别将这两组的最大值和最小值相比较,求出全部元素的最大值和最小值。
如果A1和A2中的元素多于两个,则再用上述方法各分为两个子集。
直至子集中元素至多两个元素为止。
例如有下面一组元素:-13,13,9,-5,7,23,0,15。
用分治策略比较的过程如下:图中每个方框中,左边是最小值,右边是最大值。
从图中看出,用这种方法一共比较了10次,比直接比较法的14次减少4次,即约减少了1/3。
分治策略(Divide and Conquer)一、算法思想任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。
问题规模越小,解题所需的计算时间往往也越少,从而也越容易计算。
想解决一个较大的问题,有时是相当困难的。
分治法的思想就是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
分而治之方法与软件设计的模块化方法非常相似。
为了解决一个大的问题,可以:1) 把它分成两个或多个更小的问题;2) 分别解决每个小问题;3) 把各小问题的解答组合起来,即可得到原问题的解答。
小问题通常与原问题相似,可以递归地使用分而治之策略来解决。
1、解决算法实现的同时,需要估算算法实现所需时间。
分治算法时间是这样确定的:解决子问题所需的工作总量(由子问题的个数、解决每个子问题的工作量决定)合并所有子问题所需的工作量。
2、分治法是把任意大小问题尽可能地等分成两个子问题的递归算法3、分治的具体过程:begin {开始}if ①问题不可分then ②返回问题解else begin③从原问题中划出含一半运算对象的子问题1;④递归调用分治法过程,求出解1;⑤从原问题中划出含另一半运算对象的子问题2;⑥递归调用分治法过程,求出解2;⑦将解1、解2组合成整修问题的解;end;end; {结束}二、分治策略的应用(1)二分搜索(折半查找)算法思想:将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。
通过一次比较,将查找区间缩小一半。
折半查找是一种高效的查找方法。
它可以明显减少比较次数,提高查找效率。
但是,折半查找的先决条件是查找表中的数据元素必须有序。
算法步骤描述:step1 首先确定整个查找区间的中间位置:mid = (left + right )/ 2step2 用待查关键字值与中间位置的关键字值进行比较;●若相等,则查找成功●若大于,则在后(右)半个区域继续进行折半查找●若小于,则在前(左)半个区域继续进行折半查找Step3 对确定的缩小区域再按折半公式,重复上述步骤。