- 1、本文档共27页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4讲分治策略
sanyou-zeng@263.net 第4讲 分治策略 主要内容 分治法基本思想 二分搜索算法 合并排序算法 快速排序算法 线性时间选择 4.1 分治法的基本思想 例:[找伪币问题]给你一个装有1 6个硬币的袋子。1 6个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。你的任务是找出这个伪造的硬币。为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。 一种方式 两两对比,找到轻者,最差比较8次 另外一种 1)将16个硬币分成A、B两半; 2)将A放仪器的一边,B放另一边,如果A袋轻,则表明伪币在A,解子问题A即可,否则,解子问题B。 例2-5 金块问题 有一个老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇员所得到的金块重。如果有新的金块周期性的加入袋中,则每个月都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最轻和最重的金块。 假设袋中有n 个金块。通过n-1次比较找到最重的金块。找到最重的金块后,可以从余下的n-1个金块中用类似的方法通过n-2次比较找出最轻的金块。这样,比较的总次数为2n-3。 n≤2时,识别出最重和最轻的金块,做一次比较。 n>2时, 第一步,把这袋金块平分成两个小袋A和B。 第二步,分别找出在A和B中最重和最轻的金块。HA 与LA,HB 和LB。 第三步,通过比较HA 和HB,可以找到所有金块中最重的;通过比较LA 和LB,可以找到所有金块中最轻的。 复杂度 设c(n)为比较次数。假设n是2的幂。 当n= 2时,c(n) = 1; 当n2时,c(n) = 2c(n/ 2 ) + 2。当n是2的幂时,可知c(n) = 3n/ 2 - 2。 使用分而治之方法比逐个比较的方法少用了2 5%的比较次数。 4.1 分治法的基本思想 分而治之方法与软件设计的模块化方法非常相似。为了解决一个大的问题,可以: 把它分成两个或多个更小的问题; 分别解决每个小问题; 把各小问题的解答组合起来,即可得到原问题的解答。小问题通常与原问题相似,可以递归地使用分而治之策略来解决。 分治法流程 用P表示问题的输入。 Divide-and-Conquer(P) { if (|P|=n0) Adhoc(P); divide P into smaller subinstances P1,P2,···,Pk; for(i=1;i=k;i++) yi=Divide-and-Conquer (Pi); return Merge(y1,···,yk); } 问题 应把原问题分为多少个子问题才较适宜? 每个子问题是否规模相同或怎样才为适当? 分治法计算效率 原问题规模——n 分成k个子问题,每个规模——n/m 设分解阈值n0=1,Adhoc解规模为1的问题耗费1个单位时间 设分解原问题及用Merge将k个子问题的解合并需要f(n)个单位时间 T(n)表示分治法的解规模为|P|=n的问题所需的计算时间 计算时间分析 由上可得 O(1) n=1 T(n)= kT(n/m)+f(n) n1 解上式得到 4.2 二分搜索技术 1 线性搜索 线性搜索二元比较树如下: 线性算法复杂度 该方法没有很好利用已经排好序这个条件,顺序搜索方法平均需要 O(n)次比较。 2 二分搜索方法 基本思想 取一个中间元素做比较元素,如果x等于它,则结束,如果小于,去左半部查找,否则去右半部搜索 将问题表示为:I=(n,a1,…,an,x) 选取一个下标k,可得到三个子问题: I1=(k-1,a1,…,ak-1,x) I2=(1,ak,x) I3=(n-k,ak+1,…,an,x) 二元比较树 含9个元素的情况 二元比较树 例2-6 在[9,12,15,27,39]中分别查找27,12,14 templateclass T int BinarySearch( T a[], const T x, int n) {//在a[0]=a[1]=···=a[n-1]中搜索x //如果找到,则返回所在位置,否则返回 –1 int left= ; int right= ; while(
您可能关注的文档
- 圆与直线测试题.doc
- 新课标小学数学二年级下册期末试卷.doc
- 酸碱盐金属练习.doc
- 初二数学《分式的基本性质》教案.doc
- 成型原理实验指导书 焊接部分 .doc
- 1前言和思考.ppt
- 公建节能计算书模本.doc
- C__第十章.ppt
- 2010年北京东城区高考二模数学理科试题 word版含解析 .doc
- 牛津深圳版八年级教案chapter1.doc
- 2023咸阳职业技术学院招聘笔试真题参考答案详解.docx
- 2023四川化工职业技术学院招聘笔试真题及参考答案详解.docx
- 2023哈尔滨职业技术学院招聘笔试真题及参考答案详解.docx
- 2023商洛职业技术学院招聘笔试真题及答案详解1套.docx
- 2023呼伦贝尔职业技术学院招聘笔试真题参考答案详解.docx
- 2023南阳农业职业学院招聘笔试真题参考答案详解.docx
- 2023天津公安警官职业学院招聘笔试真题带答案详解.docx
- 2023年上海电机学院招聘笔试真题参考答案详解.docx
- 2023年四川艺术职业学院招聘笔试真题参考答案详解.docx
- 2023安徽体育运动职业技术学院招聘笔试真题及答案详解一套.docx
文档评论(0)