- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
安师大数学计算机科学学院 算法设计与分析 第2部分 算法设计策略 第5章 分治法 5.1 一般方法 5.1.1 分治法的基本思想 分治法顾名思义就是分而治之。一个问题能够用分治法求解的要素是:第一,问题能够按照某种方式分解成若干个规模较小、相互独立且与原问题类型相同的子问题;第二,子问题足够小时可以直接求解;第三,能够将子问题的解组合成原问题的解。由于分治法要求分解成同类子问题,并允许不断分解,使问题规模逐步减小,最终可用已知的方法求解足够小的问题,因此,分治法求解很自然导致一个递归算法。 5.1.1 分治法的一般方法 5.1.2 算法分析 5.1.3? 数据结构 5.2 求最大最小元 5.2.1? 分治法求解 过程MAXMIN模拟 5.2.2 时间分析 5.3 二分搜索 5.3.1? 分治法求解 5.3.2? 对半搜索 对半搜索算法实例 假设在数组A(1:9)中顺序放了以下9个元素: -15 , -6 , 0 , 7 , 9 , 23 , 54 , 82 , 101 要求检索的x分别为:101 , -14 , 82 5.3.3? 二叉判定树 5.3.4 搜索算法的时间下界 5.4 排序问题 5.4.1? 合并排序 归并分类算法实例 310 285 179 652 351 423 861 254 450 520 归并分类算法实例 5.4.2? 快速排序 5.4.3 排序算法的时间下界 5.5 选择问题 5.5.1? 分治法求解 5.5.2? 随机选择主元 5.5.3? 线性时间选择算法 5.5.4 时间分析 5.5.5 允许重复元素的选择算法 5.6 斯特拉森矩阵乘法 5.6.1 分治法求解 5.6.2? 斯特拉森分治法 The end 定理5-8 程序5-13的Select算法的平均时间A(n)=O(n)。 算法的最坏情况时间复杂度O(n2) 。 改进的选择算法采用二次取中法(median of medians rule)确定主元 【程序5-14】 线性时间选择算法 ResultCode SortableListT::Select(T x,int k) { if(n=0||kn||k=0) return OutOfBounds; int j=Select(k,0,n-1,5); x=l[j];return Success; } template class T int SortableListT::Select(int k, int left,int right,int r) { int n=right-left+1; if (n=r){ InsertSort(left,right); return left+k-1; } for (int i=1;i=n/r;i++){ InsertSort(left+(i-1)*r,left+i*r-1); Swap(left+i-1, left+(i-1)*r+Ceil(r,2)-1); } int j=Select(Ceil(n/r,2),left,left+(n/r)-1,r ); Swap(left,j); j =Partition(left,right); if (k==j-left+1) return j; else if (kj-left+1) return Select(k,left,j-1,r); else return Select(k-(j-left+1),j+1,right,r); } 以二次取中的中间值mm为主元,经过一趟分划,左、右两个子表的大小均至多为: n???n/r?/2? ?r/2? 设T(n)为当表长为n时执行程序5-14所需的时间。T(n)由三部分时间组成: T(n)?T(?n/5?)+T(3n/4)+cn 用归纳法容易证明,T(n)?20cn,n?1是线性时间的。
文档评论(0)