1-Divie Conqure.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2章 分治法(Divide Conquer) (算法常用技术之首) 六大算法常用技术: 分治法(e.g. 快速排序)贪心法(局部最优法,e.g. 最小生成树) 周游法(e.g. DFS, BFS)回朔法(e.g. 8皇后问题,平面点集的凸包) 动态规划法 分枝定界法(e.g. 整数规划) 快速排序的思想: 用O(n)的时间把一个规模为n的表分割为两段, 前段中的数据元素均小于后段中的数据元素, 然后对分割后所得的两个小一点的表采用同样的方法分别进行排序;当两个小表排好之后,整个表的排序也就完成了。 分治法的要领 分治法是把一个规模较大的问题分解为若干个规模较小的子问题, 这些子问题相互独立且与原问题同类; 首先求出这些子问题的解, 然后把这些子问题的解组合起来得到原问题的解。 由于子问题与原问题是同类的,故使用分治法很自然地要用到递归。 因此分治法分三步: 1 将原问题分解为子问题(Divide) 2 求解子问题(Conquer) 3 组合子问题的解得到原问题的解(Combine) 分治法举例:给定n个数据元素,要找出其中的最大元和最小元。 简单直观的方法: 一个一个地找,用n-1次比较来找出最大元,再用n-2次比较来找出最小元。比较次数(基本运算)为2n-3次。 用分治法如何求解?(参看Aho书,P60, 图2.12) 当n=2时,一次比较就可以找出两个数据元素的最大元和最小元。 当n2时,可以把n个数据元素分为大致相等的两半, 一半有?n/2?个数据元素,而另一半有?n/2?个数据元素。 先分别找出各自组中的最大元和最小元,然后 将两个最大元进行比较,就可得n个元素的最大元; 将两个最小元进行比较,就可得n个元素的最小元。 因此算法的时间复杂度为: T(n)= 此方程可用主定理求解: a=2, b=2, f(n)=2, =n1, f(n)比的量级低(第一种情况); 所以可得T(n)= ? ()= ?(n)。 但此法还不够精确。(简单直观的算法的时间复杂度也只有2n-3。) 设n=2k, 根据递归方程有T(2k)=2T(2k-1)+2, 令T(2k)=g(k) (函数变形法), 则有g(k)=2g(k-1)+2, 从而有g(k-1)=2g(k-2)+2,g(k-2)=2g(k-3)+2,… 不断使用代入法可得:T(n)=T(2k)= g(k) = 2(2g(k-2)+2)+2 = 22g(k-2)+22 = 23g(k-3)+23+22 = … =2k-1g(1)+2k-1+ … +23+22+2 =n/2*T(2) + (2k-2) = n/2+n-2 = 3n/2-2, 即T(n)=3n/2-2。 当n?2k时,则n可表为若干2的正整数幂之和,(e.g. 42=32+8+2), 若n是偶数,则算法的时间复杂度仍可达到3n/2-2。 e.g. 对n=42,将元素分为32个一组,8个一组和2个一组共3组后, 各组找出最大、最小元分别需要46,10和1次比较, 3个最大元用2次比较即可得整体最大元,同理 3个最小元用2次比较即可得整体最小元,故有46+10+1+2+2=61, 而3n/2-2=3*42/2-2也等于61,故的确是3n/2-2。 一般地,当n?2k但为偶数时,则可将n分解为若干2的正整数幂之和: n=2m1+2m2+ … +2mk且m1m2 … mk? 对规模为ni=2mi的每组元素,找出最大、最小元需要3ni/2-2次比较, 故获得k组各自的最大、最小元需要=3n/2-2k; 然后用2k-2次比较就可从每组的最大元、最小元(均为k个)中 求出整体的最大元和最小元,故全部的比较次数仍为3n/2-2。 当n?2k但为奇数时,则可将n分解为若干2的正整数幂之和加1: n=2m1+2m2+ … +2mk+1且m1m2 … mk? 由于2m1+2m2+ … +2mk=n-1,故=3(n-1)/2-2k; 注意此时共有k+1组最大、最小元,取得整体解还需比较2k次 (单独的一个元素既是该组最大元,也是该组最小元), 故全部的比较次数为3(n-1)/2即3n/2-3/2,亦可看成为?3n/2-2?。 已经证明,在规模为n的数据元素集合中找出最大元和最小元, 至少需要?3n/2-2?次比较,即?3n/2-2?是找最大最小元算法的下界。 因此,从比较次数最少的意义上来讲, 找最大最小元的分治法算法已经达到最优。虽然从理论上看, 将n分解为若干2的正整数幂之和可以获得最少的比较次数, 但实际计算时为简单起见,一般把n个数据元素分为大致相等的两半:一半有?n/2?个数据元素,而另一半有?n/2?个数据元素。 先分别找出各自组中的最大最小元 (如组中只有一个元素,则其既是最

文档评论(0)

cj80011 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档