简单的贪心

简介: 简单的贪心

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


一、贪心算法的定义


对于一个最优化问题,通常可以使用贪心算法来求解。假设我们有一个集合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元。


三、总结


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


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

相关文章
|
2月前
|
存储 算法 Java
贪心算法和动态规划
贪心算法和动态规划
54 0
|
2月前
|
机器学习/深度学习 Kubernetes 算法
贪心算法 - 常见的问题总结(三)
贪心算法 - 常见的问题总结(三)
|
8月前
|
算法
背包问题之贪心算法
背包问题之贪心算法
58 0
|
11月前
|
算法
【贪心算法】删数问题
【贪心算法】删数问题
50 0
|
算法
贪心题:股票买卖 II
贪心题:股票买卖 II
42 0
|
算法 Java Python
【算法题解】 Day5 贪心
今天的算法是 「贪心」 相关,“算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,以实战习题的形式理解算法,使用算法。”
74 0
贪心
AcWing 134. 双端队列
93 0
|
算法 测试技术
贪心——53. 最大子数组和
本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助
贪心——53. 最大子数组和
|
算法 C++
Huffman树(贪心)
复习acwing算法基础课的内容,本篇为讲解基础算法:贪心——Huffman树,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
67 0
Huffman树(贪心)

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    26
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    24
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    22
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    20
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    20
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19