- 1、本文档共70页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 算法设计与分析 * 最好时间复杂度:如果分划点总是在中间,左边和右边中的元素数目大致相同,则计算时间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)。 * 算法设计与分析 * 各种排序算法的比较 方法 最坏复杂性 平均复杂性 冒泡排序 基数排序 插入排序 选择排序 堆排序 归并排序 快速排序 * 算法设计与分析 * 各排序算法平均时间的曲线图 * 算法设计与分析 * 课后练习 练习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)。 * 需要注意的是,主定理的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 merge(y1,...,yk); //将各子问题的解合并为原问题的解 } 在用分治法设计算法时,最好使子问题的规模大致相同,即,将一个问题分成大小相等的k个子问题(许多问题取k=2)。 这种使子问题规模大致相等的做法是出自一种平衡子问题的思想,这通常比子问题规模不等的做法要好。 * 算法设计与分析 * 例:计算an。 应用分治技术得到如下计算方法: ? ? é ù ? í ì ′ = = 1 1 2 2 n a a n a a n n n 如果 如果 34 32 32 81 31 31 9 31 31 9 3 3 3 3 分解问题 求解每个子问题 合并子问题的解 * 算法设计与分析 * 分治法的复杂性分析 从一般设计模式看,用分治法设计的程序通常是一个递归算法。 若一个
文档评论(0)