【问题标题】:Greedy algorithm or dynamic programming?贪心算法还是动态规划?
【发布时间】:2016-04-17 17:42:29
【问题描述】:

给出了列表 l = [x_1, ..., x_n]。列表中的每个元素都是某块木头的长度。要粘合两块长度为 a 和 b 的木头,您需要 max(a,b) 胶水。粘合后,你得到一块长度为 a+b 的木头。计算粘合所有部件的最少胶水量。

你认为贪心算法在这里有效吗?我想不出任何例子。说贪心算法,我的意思是:取两块最小长度的部分,粘上它们,然后这样做,直到所有部分都粘好。使用一些优先级队列,这可以在 O(n log n) 复杂度内完成。

这行得通吗?如果没有,请给我一些列表 l 的例子,它可以用比贪心算法说的更少的胶水粘合。

【问题讨论】:

  • 粘两片会增加长度吗?
  • 什么意思?当你粘合两段长度 a 和 b 时,你会得到长度为 a + 长度 b 的新段。
  • 两根棍子可以粘在一起,这就是我问的原因。在这种情况下,恕我直言,实际上胶水量取决于长度,这很奇怪。
  • 您确定有解决此问题的有效方法吗?我猜它是NP难的。例如,如果您稍微改变问题,使除了最后一次粘合之外的所有胶水都没有,那么问题是找到尽可能接近 sum(x_i)/2 的长度子集,这就是分区问题.这并不意味着这个问题也是 NP 难的,但它具有暗示性。
  • 这听起来像是用最小数量的硬币进行更改的问题。对于某些硬币面额的集合,可以用贪心算法解决,但对于其他面额则不行。我最近了解到,有一篇论文描述了一种算法,用于在有限时间内确定贪心算法是否足以满足一组给定的硬币面额。

标签: algorithm dynamic-programming greedy


【解决方案1】:

贪心算法并不总是最优的。一个反例是 [1, 2, 2, 3],贪心算法将使用 10 个单位的胶水,而最优算法将使用 9 个单位。

贪心算法:

1-2 = 2 glue
2-3 = 3 glue
3-5 = 5 glue
---------------
total = 10 glue

最佳:

2-2 = 2 glue
1-3 = 3 glue
4-4 = 4 glue
--------------
total = 9 glue

它是动态编程。

【讨论】:

  • “它是动态编程”你能详细说明你想到的算法吗?
  • 你知道这个动态算法是如何工作的吗?
【解决方案2】:

看起来没有最优的贪心算法没有通用的动态规划解决方案。我认为这是NP-hard,我会解释原因。

让我们分析问题。我们有 N 个元素。让我们将此集合拆分为两个具有 X 和 Y 元素的子集。首先,我们粘合 X 子集中的所有元素,然后以某种方式粘合 Y 子集中的所有元素(如分治法)。在最后的粘合中,我们应该粘合代表 X 和 Y 子集的 2 个元素。在最后一次胶合中,我们需要的最少胶水量是多少? X元素和Y元素之和之差最小时!我们将此问题表示为递归分区问题,它本身就是 NP 难题

【讨论】:

    【解决方案3】:

    贪心算法肯定不会像 Briguy37 所说的那样工作,因为在这种情况下,贪心局部最优解不会给你一个全局最优解。

    但是,这个问题是一个NP类问题,它不能用动态规划来解决。您需要采用蛮力方法,这将花费成倍的时间。请查看下面的树,了解我们从大小 1 开始的问题的一部分。显然,我们没有看到任何可以概括为动态规划方法的逻辑重叠子问题。

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 1970-01-01
      • 2011-09-03
      • 2012-03-26
      • 2013-11-27
      • 1970-01-01
      相关资源
      最近更新 更多