网站大量收购独家精品文档,联系QQ:2885784924
  1. 1、本文档共73页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
6分治算法

分治算法 1 例6.1排序问题 2 分治算法框架 3 二分法 4 二分法变异 5 同题异策 1 例6.1 排序问题 例:关键字序列: 49, 38, 65, 97, 76, 13, 27, 49 1 例6.1 排序问题 已学过的主要算法策略(思想) 1 例6.1 排序问题-贪婪1 分阶段 1 例6.1 排序问题-贪婪2 分阶段 1 例6.1 排序问题-贪婪3 分阶段 1 例6.1 排序问题-贪婪-总结 直接插入排序 简单选择排序 冒泡排序 1 例6.1 排序问题-贪婪-总结 直接插入排序 简单选择排序 冒泡排序 1 例6.1 排序问题-先进的排序方法 快速排序 堆排序(略) 归并排序 1 例6.1-快速排序 快速排序(复杂度O(nlogn) ): 平均速度最大的一种排序方法; 快速排序是一种不稳定的排序; 在递归调用时需要占据一定的存储空间用来保存每一层递归调用时的必要信息。 1 例6.1-归并(合并)排序-递归思路 将原始序列划分为两个子序列; 分别对每个子序列递归排序; 最后将排好序的子序列合并为一个有序序列。 2 分治算法框架-1 算法设计思想: 将整个问题分解成若干个小问题后分而治之。 如果分解得到的子问题相对来说还太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生出方便求解的子问题,必要时逐步合并这些子问题的解,从而得到问题的解。 分治法的基本步骤在每一层递归上都有三个步骤: 1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; 2)解决:若子问题规模较小而容易被解决则直接解,否则再继续分解为更小的子问题,直到容易解决; 3)合并:将已求解的各个子问题的解,逐步合并为原问题的解。 2 分治算法框架-2 有时问题分解后,不必求解所有的子问题,也就不必作第三步的操作。比如折半查找,在判别出问题的解在某一个子问题中后,其它的子问题就不必求解了,问题的解就是最后(最小)的子问题的解。分治法的这类应用,又称为 “减治法”。 多数问题需要所有子问题的解,并由子问题的解,使用恰当的方法合并成为整个问题的解,比如归并排序,就是不断将子问题中已排好序的解合并成较大规模的有序子集。 2 分治算法框架-3 适合用分治法策略的问题: 当求解一个输入规模为n且取值又相当大的问题时,用蛮力策略效率一般得不到保证。若问题能满足以下几个条件,就能用分治法来提高解决问题的效率。 1)能将这n个数据分解成k个不同子集合,且得到k个子集合是可以独立求解的子问题,其中1<k≤n; 2)分解所得到的子问题与原问题具有相似的结构,便于利用递归或循环机制; 3)求出这些子问题的解之后,就可推解出原问题的解; 2 分治算法框架-4 分治法的一般递归算法设计模式如下: Divide-and-Conquer(int n) { //n为问题规模 if (n≤n0) { //n0为可解子问题的规模 解子问题; return(子问题的解);} for (i=1 ;i=k;i++) //分解为较小子问题p1,p2,…pk yi=Divide-and-Conquer(|Pi|); //递归解决Pi T =MERGE(y1,y2,...,yk); //合并子问题 return(T); } 3 二分法 分治思想: 在算法设计中每次一个问题分解成的子问题个数一般是固定的,每个子问题的规模也是平均分配的。 二分法 当每次都将问题分解为原问题规模的一半时,称为二分法。 二分法是分治法较常用的分解策略,数据结构课程中的折半查找、归并排序等算法都是采用此策略实现的。 3 例6.2 金块问题 金块问题:老板有一袋金块(共n块),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最重的金块。 3 例6.2 金块问题-算法设计1 算法设计1:比较简单的方法是逐个进行比较查找。先拿两块比较重量,留下重的一个与下一块比较,直到全部比较完毕,就找到了最重的金子。 算法类似于一趟选择排序,算法如下: maxmin( float a[],int n) { max=a[1]; min=a[1]; for(i=2 i=n i++) if(max a[i]) max=a[i]; else if(min a[i])

文档评论(0)

zyzsab + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档