5算法第五章贪心法
- 格式:ppt
- 大小:1.54 MB
- 文档页数:53


贪心算法知识点总结1. 基本原理贪心算法的基本原理是每一步都选择当前状态下的最优解,以期望最终得到全局最优解。
具体来说,贪心算法通常可以分为以下几个步骤:1)从问题的某个初始解出发2)采用一种迭代的方式,逐步将初始解进行优化3)每一步都是基于当前状态的最优选择来进行优化4)直到无法再进行优化,得到问题的最优解由于贪心算法每一步都要选择局部最优解,因此贪心算法通常具有高效性。
然而,贪心算法并不适用于所有问题,其结果不一定是全局最优解。
因此,在使用贪心算法时需要注意问题的特性和约束条件,以免得到错误的结果。
2. 适用情况贪心算法通常适用于满足以下条件的问题:1)问题的最优解满足“最优子结构”性质:即问题的最优解包含了其子问题的最优解2)问题的求解过程具有“贪心选择性”:即每一步都选择当前状态下的最优解,并不需要考虑未来的后果3)问题的约束条件可以通过局部最优选择满足全局最优解:即问题的解空间中存在一些局部最优解,可以通过一系列的局部最优解构建全局最优解在实际应用中,贪心算法通常用于求解最优化问题,如最小生成树、最短路径、任务调度等问题。
由于贪心算法的高效性,它通常能够在较短的时间内得到较为接近最优解的结果。
然而,贪心算法并不适用于所有问题,对于一些问题,贪心算法将得到错误的结果。
因此,在使用贪心算法时需要谨慎选择问题类型和约束条件,以避免错误的结果。
3. 贪心算法实例在下面的部分,我们将介绍一些常见的贪心算法实例,包括背包问题、活动安排问题、霍夫曼编码等。
3.1 背包问题背包问题是一个经典的优化问题,它包括0-1背包问题、分数背包问题等多种类型。
在0-1背包问题中,给定n种物品和一个容量为C的背包,每种物品i的重量为w[i],价值为v[i],求在不超过背包容量的情况下,如何选择物品放入背包,可以使得背包中的总价值最大。
对于0-1背包问题,贪心算法通常不能得到最优解。
然而,在分数背包问题中,贪心算法通常可以得到近似的最优解。
贪心算法一、问题举例:谷仓修补[1999 USACO Spring Open]有一长列畜栏,其中的一些需要用木板覆盖。
你可以用最多N个(1<=N<=50)木板,其中的每一个都可以覆盖任意数量的连续畜栏。
覆盖全部需要覆盖的畜栏,但是使被覆盖的畜栏尽量少。
思想:在贪心算法背后隐藏的基本思想是从小的方案推广到大的解决方法。
然而与其他方法不同的是,贪心算法只需随着过程的进行保持现下的最好方案。
因此,对于这个例题,如果需要找到N=5时的最优方案,应该寻找N=4时的最优解,然后加以改变得到N=5的解法。
至于N=4时的其它解法,可以不予考虑。
贪心算法快速,而且仅需要很小的额外内存消耗。
但是很不幸地,它往往是不正确的。
然而当他们的确是正确的时候,便可以很轻易地贯彻执行并拥有足够快的速度。
问题:贪心算法有两个基本的问题。
如何建立:怎样从一个规模较小的解推出规模较大的解呢?拿这个例题来说,从四个木板变化到五个木板的最明显的途径是将一个木板移去一部分而拆成两个。
你应该选择移除最大的只覆盖了不需要覆盖的部分。
为了移除这样的部分,选择跨越了这部分的一块木板将它拆成两部分,一块覆盖这些畜栏之前的部分,另一块覆盖这些畜栏之后的部分。
解法确实正确?对于程序员来说,真正的挑战在于贪心算法不一定总是有效这个事实。
即使它对于特定输入,随机输入,乃至一切你能想到的情况都是正确的,但是如果如果有一种情况它不能正确地工作,至少一个(或者更多)的裁判测试就会是这种类型。
对于这个例题,为了确保贪心算法确实是有效的应该做如下的考虑:假设答案并没有包含贪心算法移除的大型缺口,而是包含了一个小一些的缺口,通过将较小缺口两端的木板合并并炸开跨越了更大缺口的木板所得到的答案,使用了和原先一样多的木板,但是覆盖的畜栏更少一些。
这个新的方案更好一些,所以之前的假设是错误的,我们总是应该选择移除最大的缺口。
如果答案没有包含这个特定的缺口而是包含了一个正好和它一样大的缺口,通过同样做法所产生出的答案在覆盖的畜栏和使用的木板数上均与原来相同。
贪心算法的概念和适用条件什么是贪心算法?贪心算法(Greedy Algorithm)是一种以局部最优解为导向的算法思想,通过每一步选择当前状态下的最佳操作来达到整体最优解的目标。
贪心算法的核心思想是每次都做出当前看来最优的选择,以期望能够达到整体的最优解。
贪心算法通常用于一些问题中,即每一步的选择只依赖于当前状态,而不考虑将来可能出现的情况。
贪心算法的适用条件:1. 贪心选择性质:贪心算法每一步都选择一个当前的最优解,此处的“最优”指的是局部最优。
这种最优选择可以确保问题能够被拆解,并且进行下一步求解。
2. 最优子结构性质:当问题的整体最优解能够通过局部最优解得到时,可以采用贪心算法求解。
这种情况下,问题的最优解可以由子问题的最优解推导出来。
3. 无后效性:贪心算法选择某一步操作时,只考虑当前状态,不会改变以前的操作,并且不关心未来的操作。
这种无后效性使得贪心算法在实际应用中操作简单、效率高。
贪心算法的基本步骤:1. 确定问题的局部最优解:贪心算法的核心是每一步都选择在当前情况下的最优解。
因此,需要确定问题如何拆解以及如何进行局部最优选择。
2. 定义问题的子问题:根据问题的最优子结构性质,将问题拆解为较小规模的子问题。
子问题应该是原问题的一个更小、更简单的实例。
3. 定义贪心选择策略:根据问题的特性,确定当前步骤下的最优选择策略。
这个选择应该是局部最优的,可以在不考虑子问题和整体未来状态的情况下得出。
4. 重复执行步骤2和3,直至求解出全局最优解。
贪心算法的优缺点:贪心算法具有简单易懂、快速高效的特点,适用于许多实际问题。
它可以避免穷举所有可能性,节省了计算时间。
此外,贪心算法常常能够找到近似最优解,尽管不一定能够保证全局最优解。
在实际问题中,近似最优解也往往可以满足实际需求。
然而,贪心算法并非适用于所有问题。
由于贪心算法只考虑当前状态的最优选择,而不考虑未来的影响,因此可能会导致局部最优解与全局最优解不一致。