贪心算法概述及研讨.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文档。上传文档
查看更多
对贪心算法的概述和研讨 福州第一中学 高一(8)班 汪涛 指导老师:陈颖 算法总览 当一个问题具有“最优子结构”时,我们可以采用动态规划法解决该问题。但是有的时候,贪心算法可以更好的处理该类问题。总体上看,贪心算法是一种高效的、不稳定的算法;但是它在解决问题时有很多独特的优良性质,掌握贪心算法有时可以非常迅速的获得最优解或近似最优解。 关键字:贪心算法(贪婪算法),贪心算法的应用举例,Object Pascal,快速算法,不稳定算法,信息学奥赛。 何时采用 何时能,又何时应该采用贪心算法呢?一般认为,凡是经过数学归纳法证明可以采用贪心算法的情况,都应该采用它。因为它的效率是很高的。贪心算法的弱点在于它的不稳定性,即有时它不总能返回最优解。 那么能采用贪心算法的问题具有怎样的性质呢?(何时采用贪心算法) 1、它具有和动态规划问题相似的性质,即分治法中的“最优子结构”性质,即每个子问题的最优解的集合就是整体最优解。这是必须的性质,因为贪心算法解决的问题流程就需要依序研究每个子问题,然后综合之得出最后结果。不能采用分治法解决的问题,是理论上是不能使用贪心算法的。而且,必须拥有最优子结构性质,才能保证贪心算法返回最优解。 2、它必须具有一种特殊的“贪心选择性”。这种性质类同于“最优子结构”性质,但又有一些小的差别。我们知道,在动态规划中,每一个父问题结果的得出需要它的子问题作为条件;但是“贪心选择性”则不需要;贪心选择性所做的是一个非线性的子问题处理过程,即一个子问题并不依赖于另一个子问题,但是子问题间有严格的顺序性。要证明一个问题具有“贪心选择性”,就必须证明每一步所做的贪心选择最终导致一个问题的整体最优解。这也是必须的性质。 如果一个问题具有上述两个性质,理论上就应该采用贪心算法。 处理流程 经由贪心算法处理的问题需要经过排序。即把“最贪心”的子结果排在序列的最前面,一直到“最不贪心的”。这是处理问题的第一步。然后依序解决问题而得出最终结果。归纳起来,贪心算法处理问题需要下面四步: 读入一个问题 进行贪心排序 处理问题 综合结果并输出 “进行贪心排序”和“处理问题”这两步,是贪心算法的核心部分,甚至能有子问题的重叠和多个贪心问题的重叠。 一般的,经过快速排序产生子问题结果序列的时间复杂度为O(nlogn)。 应用举例 贪心算法所应用的问题都具有“最优子结构”和“贪心选择性”。它的应用范围是比较广泛的。在一些不好解决的问题中,贪心算法也可以被采用从而很方便的得出近似最优解。下面是最简单的例子,主要是为了加深对算法的应用的认识: 例1 找零钱问题 一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币找给小孩。假设提供了数目不限的面值为2 5美分、1 0美分、5美分、及1美分的硬币。售货员分步骤组成要找的零钱数,每次加入一个硬币。选择硬币时所采用的贪心准则如下:每一次选择应使零钱数尽量增大。为保证解法的可行性(即:所给的零钱等于要找的零钱数),所选择的硬币不应使零钱总数超过最终所需的数目。 假设需要找给小孩6 7美分,首先入选的是两枚2 5美分的硬币,第三枚入选的不能是2 5美分的硬币,否则硬币的选择将不可行(零钱总数超过6 7美分),第三枚应选择1 0美分的硬币,然后是5美分的,最后加入两个1美分的硬币。 贪心算法有种直觉的倾向,在找零钱时,直觉告诉我们应使找出的硬币数目最少(至少是接近最少的数目)。可以证明采用上述贪心算法找零钱时所用的硬币数目的确最少。 下面是一个Object Pascal语言的例子,为了简便起见,我们仅保留Form_Create事件中的代码: 上面的程序运行结果如下图: 输入Total和Value以后,程序将给出数个MessageBox,给出找钱的方案。 由于这个程序的硬币面值是给定的,所以无须排序的操作。但是仔细看程序会发现,其中判断找钱的顺序是由大面额到小面额的,这就是贪心算法的核心;上面程序中的暗红色框中的代码段就是。 本题中的硬币面值实际上具有特殊性,详细说明请参阅“深入探讨”一节。 例2 机器调度问题 现有n 件任务和无限多台的机器,任务可以在机器上得到处理。每件任务的开始时间为si,完成时间为fi ,si fi 。[si , fi ] 为处理任务i 的时间范围。两个任务i,j 冲突是指两个任务的时间范围区间有重叠,而并非是指i,j 的起点或终点重合。例如:区间( 1,4 )与区间( 2,4 )重叠,而与区间( 4,7 )不重叠。一个可行的任务分配是指在分配中没有两件重叠的任务分配给同一台机器。因此,在可行的分配中每台机器在任何时刻最多只处理一个任务。最优分配是指使用的机器最少的可行分配方案。 一种获得最优分配的贪心方法是逐步分配任务

文档评论(0)

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

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

1亿VIP精品文档

相关文档