算法设计与分析:第四章3--分治法.pptxVIP

  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文档。上传文档
查看更多
第二章 4.3分治法 学习要点:进一步理解递归的概念。掌握设计有效算法的分治策略。通过下面的范例学习分治策略设计技巧。(1)二分检索技术;(2)找最大和最小元素(3)归并分类(4)快速分类;选择问题——(5)大整数乘法;(6)Strassen矩阵乘法;(7)循环赛日程表。(8)最接近点对问题; 棋盘覆盖;4.3.1 分治法的策略1 算法的总体思想 当要求解一个输入规模为n且取值相当大时,直接求解往往是非常困难的,有时甚至是无法求出的。此时可采用的方法是:仔细分析问题本身所具有的特性,然后根据其特性选择适当的设计策略来求解。 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些类型相同的、规模较小的、可独立求解的子问题,求解后还可以找到适当的方法把它们合并成整个问题的解。 事实上,任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于n个元素的排序问题,当n=1时,不需任何计算。n=2时,只要作一次比较即可排好序。n=3时只要作3次比较即可,…。而当n较大时,问题就不那么容易处理了。要想直接解决一个规模较大的问题,有时是相当困难的。 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 n/2n/2n/2n/2T(n)T(n)T(n)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)nnn===T(n/2)T(n/2)T(n/2)T(n/2)n/2n/2n/2n/2T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)T(n/4)将要求解的较大规模的问题分割成k个更小规模的子问题。对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治法的基本步骤在每一层递归上都有三个步骤:1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; 2)解决:若子问题规模较小而容易被解决则直接解,否则再继续分解为更小的子问题,直到容易解决; 3)合并:将已求解的各个子问题的解,逐步合并为原问题的解。 分治策略应用广泛。 有时也称之为“减治法”2 分治法的适用条件分治法所能解决的问题一般具有以下几个特征:该问题的规模缩小到一定的程度就可以容易地解决;该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质利用该问题分解出的子问题的解可以合并为该问题的解;该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 这条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划较好。能否利用分治法完全取决于问题是否具有这条特征,如果具备了前两条特征,而不具备第三条特征,则可以考虑贪心算法或动态规划。因为问题的计算复杂性一般是随着问题规模的增加而增加,因此大部分问题满足这个特征。3 分治法的基本步骤(算法的框架)若问题可以直接求解,则直接求解;否则将问题分解成若干规模较小、相互独立与原问题类型相同的子问题;递归求解各子问题;由子问题的解合并得到原问题的解;Divide_and_Conquer(P){ if (|P|足够小) return Answer(P); Divide P into (P1, P2, .., Pk) for i←1 to k do ai = Divide_and_Conquer(Pi); return Merge(a1, a2, .., ak);}例如:直接插入排序可以看作是把原问题分解成两个子问题,一个是规模为1的问题,另一个是规模为n-1的问题,算法的时间代价是O(n2)级的。而归并排序把原问题分成了两个大小为n/2的问题,算法的时间代价是O(nlog2n)级的。 人们从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。即将一个问题

文档评论(0)

学习让人进步 + 关注
实名认证
文档贡献者

活到老,学到老!知识无价!

1亿VIP精品文档

相关文档