- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 算法设计与分析 * 最好时间复杂度:如果分划点总是在中间,左边和右边中的元素数目大致相同,则计算时间T(n)满足: ? í ì + ≤ = 1 ) /2 ( 1 O(1) ) ( n O(n) n 2T n n T T(n) = O(nlogn) 平均时间复杂度:O(nlogn) 辅助空间:需要的递归栈空间为O(n),如使用栈将递归化为迭代并每次分划后将长度较大的段压入栈中则栈空间长度为O(logn)。 * 算法设计与分析 * 各种排序算法的比较 方法 最坏复杂性 平均复杂性 冒泡排序 基数排序 插入排序 选择排序 堆排序 归并排序 快速排序 * 算法设计与分析 * 各排序算法平均时间的曲线图 2.9 循环赛日程表 设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)循环赛一共进行n-1天。 按分治策略,将所有的选手分为两半,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用对选手进行分割,直到只剩下2个选手时,比赛日程表的制定就变得很简单。这时只要让这2个选手进行比赛就可以了。 1 2 3 4 5 6 7 8 2 1 4 3 6 5 8 7 3 4 1 2 7 8 5 6 4 3 2 1 8 7 6 5 5 6 7 8 1 2 3 4 6 5 8 7 2 1 4 3 7 8 5 6 3 4 1 2 8 7 6 5 4 3 2 1 * 算法设计与分析 * 课后练习 练习1:给定数组a[0:n-1], 试设计一个分治法算法,找出a[0:n-1]中元素最大值和最小值; 写出该算法时间函数T(n)的递推关系式; 分析该算法的时间复杂度和空间复杂度。 * 算法设计与分析 * 课后练习 练习2:分析如下时间函数的复杂度,并说明原因。 1. 利用递归树说明以下时间函数的复杂度: 2. 利用主定理说明以下时间函数的复杂度: T(n) = 9T(n/3) + n T(n) = T(2n/3) + 1 T(n) = 3T(n/4) + nlogn * 算法设计与分析 * 课后练习 练习3:算法实现题2-10(教材第45页)集合划分问题。 补充:写出该算法时间函数T(n)的递推关系式,并分析其时间复杂度和空间复杂度。 * 算法设计与分析 * 结束 End 归纳法的思想方法: a1是问题P(1)的解,如果a2=P(a1),则a2是问题P(2)的解…,依此类推,若an-1是问题P(n-1)的解,且an=P(an-1),则an是问题P(n)的解 * * 总的工作:Hanoi(n,X,Y,Z);其中步骤二:Hanoi(n-1,X,Z,Y);步骤三:Move(X,n,Y);步骤四:Hanoi(n-1,Y,X,Z)。 * 19 13 05 27 01 26 31 16 * -15,-6,0,7,9,23,54,82,101 * 需要注意的是,主定理的3种情况并没有覆盖所有的f(n),存在某些f(n)不满足以上任意一种情况的条件 * * * 算法设计与分析 * 总结:分治法的适用条件 分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同子问题,即该问题具有最优子结构性质; 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划较好。 应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用。 关键特征,能否利用分治法完全取决于问题是否具有第四条特征,如果具备了第一条和第二条特征,而不具备第四条特征,则可以考虑贪心法或动态规划法。 * 算法设计与分析 * 总结:分治法的基本步骤 划分:把规模为n的原问题划分为k个规模较小的子问题,并尽量使这k个子问题的规模大致相同。 求解子问题:各子问题的解法与原问题的解法通常是相同的,可以用递归的方法求解各个子问题,有时递归处理也可以用循环来实现。 合并:把各个子问题的解合并起来. * 算法设计与分析 * divide-and-conquer(P) { if (|P|=n0) adhoc(P); //n0是一阈值,直接解小规模的问题 divide P into smaller subinstances P1,P2,...,Pk; //分解问题 for (i=1; i=k; i++) yi=divide-and-conquer(Pi); //递归求解各子问题 return m
文档评论(0)