贪心算法(英語:greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。
常见的贪心问题有:海盗分金、行商问题(最短路径问题)
简介
贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。
贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。
贪心选择:贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终能得到问题的最优解。通常可以首先证明问题的一个整体最优解,是从贪心选择开始的,而且作了贪心选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法证明,通过每一步贪心选择,最终可得到问题的一个整体最优解。
最优子结构:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法或动态规划算法求解的关键特征。贪心算法的每一次操作都对结果产生直接影响,而动态规划则不是。贪心算法对每个子问题的解决方案都做出选择,不能回退;动态规划则会根据以前的选择结果对当前进行选择,有回退功能。动态规划主要运用于二维或三维问题,而贪心一般是一维问题
应用
贪心法可以解决一些最优化问题,如:求图中的最小生成树、求哈夫曼编码……对于其他问题,贪心法一般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。
贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止
其分解的一般过程为:
- 建立数学模型来描述问题。
- 把求解的问题分成若干个子问题。
- 对每一子问题求解,得到子问题的局部最优解。
- 把子问题的解局部最优解合成原来解问题的一个解。
关于贪婪算法的最新文章!
- 数组的最小乘积子集
- 数组的最大乘积子集
- k求反后最大化数组和| 套装1
- k求反后最大化数组和| 套装2
- 最大化arr [i] * i的总和
- n个数组中升序元素的最大和
- 数组绝对差的最大和
- 最大化圆形阵列中的连续差异之和
- 给定对象数组的最大高度金字塔
- 划分为两个长度为k和(N – k)的子数组,以使总和之差最大
- 两个数组的乘积的最小和
- 通过从数组中选择最少的对来求和
- 两个数组对的绝对差的最小和
- 使数组的GCD为k的倍数的最小运算
- 两个数组对的绝对差的最小和
- 由数组的数字组成的两个数字的最小和
- 最小增量/减量使数组不递增
- 使两个数组的元素相同,最小增减
- 最小化允许排列的两个数组的乘积之和
- 围绕中间反向排序数组
- 数组的矩形面积总和
- 使用单步移动k的数组元素
- 查找是否可以在给定的到达和离开时间进行k笔预订
- 在最多进行K次连续交换之后,按词典顺序排列的最小数组
- 具有最多K个连续交换的最大词典词典数组
- 将n分解为最大合成数
- 可以提供停车的最大列车
- 如果在第i天可以购买i个股票,则购买最大库存
- 找出购买所有N个糖果的最低和最高金额
- 可能的最大总和等于三个堆叠的总和
- 可以使k次更新等于的最大元素
- 将长方体分成多个立方体,以使体积总和最大
- 给定数量可以满足的最大客户数量
- 总和等于K的最小斐波那契项
- 将1到n分为两组,且总和差异最小
- 减少朋友间的现金流
- 最小旋转以解锁圆形锁
- 纸切成最小平方数
- 两个大小的组之间的最小差异
- 在给定时间表下,n批次的m个事件的最小房间
- 以最小的成本连接n条绳索
- 将木板切成正方形的最低成本
- 在切换成本的情况下处理m个任务的最低成本
- 通过移除更大的对来使阵列大小为1的最低成本
- 购买所有硬币的最低成本,每个硬币允许有k个额外的硬币
- 在给定限制下完成所有工作的最短时间
- 火车站/汽车站所需的最少平台数量
- 最小化塔高之间的最大差异
- 通过k次运算的最小增量,以使所有元素相等
- 反转的最小边缘,以形成从源到目的地的路径
- 查找总和等于给定金额的最小数量的纸币和值
- 在给定条件下遍历整个矩阵的最小初始顶点
- 查找通过从数字中删除最少的数字而形成的最大的多维数据集
- 检查岛上是否有可能生存
- 按排列数字排列的最大回文数
- 位数为N且可被10 ^ N整除的最小数字
- 查找具有给定数字位数和总和的最小数字
- 重新排列字符串中的字符,以使相邻的两个字符都不相同
- 重新排列字符串,以使所有相同字符相距d
- 打印不包含相邻重复项的最接近的字符串
- 总和大于所有其他元素的最小子集
- 词典上最大的子序列,每个字符至少出现k次