【问题标题】:greedy algorithms贪心算法
【发布时间】:2023-04-02 19:43:01
【问题描述】:

我是算法新手,目前正在使用 YouTube 视频教程/讲座和一本书进行学习,我首先观看视频,然后阅读本书,最后尝试书中的一个问题,以确保我已经学习了该主题正确。我目前正在使用贪婪算法,这非常令人困惑。

书中有各种各样的问题,但我无法理解和回答特定的问题。

首先它给出的问题是(我刚刚复制了文本)。

有一组 n 个大小为 {x1; x2;..... xn} 和一个带有 容量 B。所有这些都是正整数。尝试找到这些对象的子集 使它们的总大小小于或等于 B,但尽可能接近 B。

所有对象都是一维的。例如,如果对象的大小为 4、7、10、12、15 和 B = 20,那么我们应该选择 4 和 15,总大小为 19(或等效地,7 和 12)。 对于以下每个贪心算法,通过创建它们来证明它们不是最优的 一个反例。尝试使您的示例尽可能糟糕,其中“不良” 由最优解和贪婪解之间的比率来衡量。因此,如果最好 解的值为 10,贪心解的值为 5,则比率为 2。

我该如何做以下事情?

1) 始终选择尺寸最大的对象,以便此和所有的总尺寸 其他已选择的对象不超过 B。对其余对象重复此操作。

【问题讨论】:

  • 我试图创建一个修改后的“prims 算法”来解决这个问题,但它非常混乱而且可能不正确。
  • Prim 的算法在图中构建了一个生成树。也许您想解释一下这个算法如何适用于手头的问题。

标签: algorithm greedy


【解决方案1】:

假设以下问题的实例:

你有一个大小为2n的盒子,一个大小为n+1的元素,其余的大小为n

很容易看出,最优是 2 个大小为 n 的元素,而贪婪者会得到一个大小为 n+1 的元素。

由于每个n 都是如此,它实际上为您提供了至少使用这种贪婪方法2 的所需比率。

【讨论】:

  • 这在伪代码中会是什么样子,因为这有助于我更好地理解它。
  • @user1252908:什么伪代码?反例?它只是一个元素数组......我不确定我是否在关注你......
  • 噢!对不起,我看到了,已经连续研究了 4 个小时!!!谢谢你的解释。
  • 最后一个问题,如果我们尝试所有对象对并找到最大总大小仍然最多为 B 的对,然后使用上述方法填充剩余空间,如果有的话任何。
  • @user1252908:4/3 的比例很容易看出:假设B=4n,4 个大小为n 的框和4 个大小为n+1 的框。最优解是 4 盒n,而算法会产生 2 盒大小为n+1 和 1 盒n,所以总共有3n+2,比例为4n/(3n+2)。由于每个n 都是如此,因此您的比率为 4/3。我相信你可以找到一个“更高”比率的反例,但我不确定。
【解决方案2】:

这听起来类似于 0-1 背包问题,其中每个项目的大小不同但值相同,这意味着任何一个项目除了其大小之外没有任何偏好放入垃圾箱。在您的代码中,您需要检查每个项目并计算导致的最大总大小,无论是否将其放入垃圾箱而不超过垃圾箱的容量。

【讨论】:

    猜你喜欢
    • 2022-12-07
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多