简单的贪心

简介: 简单的贪心

贪心算法是一种常见的递归或迭代的算法设计思想,它的主要思想是:在每一步选择中都采取当前状态下最优的选择,从而希望结果是全局最优的。


一、贪心算法的定义


对于一个最优化问题,通常可以使用贪心算法来求解。假设我们有一个集合S,每个元素都拥有一个权值w和一个价值v,我们的目标是从这个集合中选择一个子集S’,以使得S’中的元素的价值之和最大,而且满足S’的自然限制条件。


在这个问题中,我们假设所有元素的权值和价值都是正数,并且S’中的元素需要满足一些特定的自然限制条件,比如S’的总重量不能超过一个限制值,或者S’中元素的总数量需要满足一些限制条件。在这种情况下,贪心算法可以高效地求解这个最大价值问题。


具体而言,贪心算法的求解过程大致可以描述为:


计算每个元素的性价比。

对于集合S中的每个元素i,我们可以计算其性价比值ρi=v/w。其中,v表示元素i的价值,w表示元素i的权值。


按照性价比从大到小排序

将所有元素按照性价比从大到小排序,得到一个排好序的集合S1。


依次选择元素。

依次遍历S1中的每个元素,如果当前元素能够被选择,则将其加入到S’中,并更新S’的价值之和。如果当前元素不能被选择,则将其跳过。


输出结果。

当遍历完成后,S’中包含的就是最优解的子集。我们可以输出S’的所有元素,以及它们的价值之和。


具体而言,贪心算法的实现过程大致可以分为以下三个步骤:


二、贪心算法的实现过程


1、求解最优子结构

贪心算法的第一步即是求解最优子结构,也就是将原问题分解为若干个子问题进行求解。这些子问题可以独立地求解,并且子问题的解可以组合成原问题的一个全局最优解。


2、确定贪心选择性质

在贪心算法中,每一步都要做出当前状态下最优的选择,这就要求问题具有一定的贪心选择性质。一般来说,如果一个问题具有贪心选择性质,则可以使用贪心算法求解。


3、设计贪心策略

贪心策略即是每一步如何选择最优解的策略。具体而言,贪心算法通常采用贪心策略来选择当前状态下的最优解,然后利用这个最优解来更新状态,并进入下一步迭代。


在实际应用中,贪心算法可以用来解决各种各样的问题,比如最小生成树、单源最短路径、背包问题等等。贪心算法的时间复杂度一般比较低,通常可以在O(nlogn)或者O(n)的时间内完成计算。但是贪心算法也有一些局限性,比如在处理涉及时间序列变化的问题时,贪心算法往往不能保证得到最优解~~


三、实例分析


为了更好地理解贪心算法,接下来我们将演示一个具体的实例分析。假设我们有一台机器,可以生产3种不同型号的产品A、B、C。我们的目标是最大化收益,并且不超出机器的生产能力限制。假设机器的生产能力为100个单位,而A、B、C三种产品需要的生产能力分别为25个单位、35个单位、45个单位。此外,每种产品的单价分别为4、5、6元。


计算性价比

首先,我们需要计算每种产品的性价比,即ρi=vi/wi。根据上述数据,我们可以得到:


ρ(A)=4/25=0.16


ρ(B)=5/35=0.14


ρ©=6/45=0.133


按照性价比排序

将三种产品按照性价比从大到小排序,得到:


A B C


即A的性价比最高,排在首位;C的性价比最低,排在末位。


依次选择元素

接着,我们开始依次选择产品。由于A的性价比最高,我们首先选择它。根据上述数据,每个A产品的单价为4元,而机器的生产能力为100个单位,因此我们至少需要生产25个A产品才能达到最优解。


接着看B。由于我们已经生产了25个A产品,机器的生产能力只剩下75个单位,因此我们最多只能生产2个B产品(35×2=70)。因此,在这种情况下,我们只需要生产2个B产品,而不是尽可能多地生产B。


最后是C。由于A和B已经占用了60个生产单位,因此机器只剩下了40个生产单位。由于每个C产品需要45个单位,因此无法继续生产C产品。因此,在这种情况下,我们不生产C产品。


输出结果

根据上述分析,最优解子集S’中应该包含25个A产品和2个B产品。此时,S’的价值之和为:


V(S’)=25×4+2×5=110


即最大的价值之和为110元。


三、总结


贪心算法是一种求解最优化问题的高效算法。它的主要思想是每一步都选择局部最有利的解,希望通过这种选择得到全局最优的解。在实际应用中,贪心算法常常用于求解一些包括数学优化、资源分配、机器学习等领域中的问题。


当然,贪心算法也存在一些局限性。由于它每一步都选择局部最有利的解,无法考虑到全局的影响,因此在一些问题中,它无法得到全局最优解。此外,在实际应用中,贪心算法的求解效率也往往会受到数据规模的限制,因此需要根据具体情况选择合适的算法。

相关文章
|
4月前
|
存储 算法 Java
贪心算法和动态规划
贪心算法和动态规划
66 0
|
4月前
|
机器学习/深度学习 消息中间件 Kubernetes
动态规划-线性DP问题总结(一)
动态规划-线性DP问题总结(一)
|
4月前
|
消息中间件 Kubernetes NoSQL
动态规划-线性DP问题总结(二)
动态规划-线性DP问题总结(二)
|
4月前
|
人工智能 Kubernetes 算法
贪心算法 - 常见的问题总结(二)
贪心算法 - 常见的问题总结(二)
|
算法
贪心题:股票买卖 II
贪心题:股票买卖 II
53 0
|
人工智能 算法
贪心算法的证明题
贪心算法的证明题
186 0
|
机器学习/深度学习 存储 算法
贪心算法
贪心算法
327 0
贪心算法
爬楼梯(动态规划)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
60 0
贪心
AcWing 134. 双端队列
108 0