繁体   English   中英

贪心算法还是动态规划?

[英]Greedy algorithm or dynamic programming?

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

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

那样有用吗? 如果没有,请给我一些列表 l 的例子,它可以用比贪婪算法所说的更少的胶水粘合。

贪心算法并不总是最优的。 一个反例是 [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

是动态规划。

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

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

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

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

从大小 1 开始的树

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM