算法设计与分析所有课件第四章.pptx

算法设计与分析所有课件第四章.pptx

  1. 1、本文档共88页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章 分治法4.1 一般方法4.2 二分检索4.3 找最大和最小元素4.4 归并分类4.5 快速分类4.6 选择问题4.7 斯特拉森矩阵乘法合并解…相同类型子问题1子问题2子问题K子问题1子问题2…子问题k4.1 一般方法分治法的思想: 将一个输入规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同,然后递归的求解这些子问题,最后用适当的方法将各子问题的解合并成原问题的解。问题(N个输入)分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。步骤:分(devide) 二分为主 多分比二分更好吗? 治(conquar) 递归调用,当规模足够小时直接处理 组(combine) 分治法问题特征:问题规模小到一定的程度就非常容易解决 所有问题的共性特征2) 问题可分解为若干个规模较小的同类问题 递归策略 [分]3) 子问题的解可以合并为该问题的解 若不具备,可用贪心或动态规划4) 子问题是相互独立的 保证采用分治法效率高,否则更适合采用动态规划 4.1 一般方法分治策略DANDC的抽象化控制原问题为A(1:n) , 最初调用函数应该是DANCE(1,n); DANDC(p,q)是计算A(p:q)子问题的解procedure DANDC(p,q)global n, A(1:n); integer m, p, q; //1≤p≤q≤n//if SMALL(p,q) then return(G(p,q)) else m?DIVIDE(p,q) return(COMBINE( DANDC(p,m), DANDC(m+1,q)))endifend DANDC判断输入规模q-p+1是否足够小,可直接求解G是求解该规模问题的函数分割函数, p≤m≤q, 原问题被分为A(p:m)和A(m+1:q)两个子问题合并函数,将两个子问题的解合并为原问题的解g(n) n足够小T(n)=2T(n/2)+f(n) 否则4.1 一般方法2分策略DANDC的计算时间倘若所分成的两个子问题的输入规模大致相等,则分治策略DANDC的计算时间可表示为:说明:T(n)是输入规模为n的分治策略的计算时间g(n)是对足够小的输入规模能直接计算出答案的时间f(n)是COMBINE函数合成原问题解的计算时间k分法的复杂性分析一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。设分解阈值n0=1,且解规模为1的问题耗费1个单位时间。再设将原问题分解为k个子问题以及将k个子问题的解合并为原问题的解需用f(n)个单位时间。用T(n)表示该分治法解规模为|P|=n的问题所需的计算时间,则有:通过迭代法求得方程的解:注意:递归方程及其解只给出n等于m的方幂时T(n)的值,但是如果认为T(n)足够平滑,那么由n等于m的方幂时T(n)的值可以估计T(n)的增长速度。通常假定T(n)是单调上升的,从而当mi≤nmi+1时,T(mi)≤T(n)T(mi+1)。 对所求解的问题(或子问题)所选的下标都是中间元素的下标,k= (n+1)/2」4.2 二分检索二分检索问题描述: 已知一个按非降序排列的元素表a1, a2, … , an , 判定某个给定元素x是否在该表中出现,若是, 则找出该元素在表中的位置,并置于j, 否则置j为0二分检索原理将二分检索问题问题表示为:I=(n, a1, … , an, x)选取一个下标k,可得到三个子问题:I1=(k-1, a1, … , ak-1, x)I2=(1, ak , x)I3=(n-k, ak+1, … , an, x)二分检索算法procedure BINSRCH(A, n, x, j) int low, high, mid, j, n; low?1; high?n; while (low=high) do mid??(low+high)/2?; /*取中间值*/ case xA[mid]: high?mid-1 /*寻找前一半*/ xA[mid]: low?mid+1 /*寻找后一半*/ else: j?mid; return; /*检索成功, 结束*/ endcase repeat j?0;/*检索失败*/end BINSRCH③③①②④③④②二分检索实例:设在A(1:9)中顺序放了以下9个元素:A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]-15-6079235482101检索x=9, 9=A[5], 一次比较就成功, 最好情况检索x=-15, -15A[5], -15A[2], -15= A

文档评论(0)

183****7931 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档