贪心算法及其实现



你好,我刚刚开始学习贪婪算法,我首先看了经典的硬币更换问题。我可以理解算法中的贪婪(即,选择局部最优解以获得全局最优解),因为我选择的是硬币的最大值,使得sum+{所选硬币的价值}<=总价值。然后我开始解决一些网站的贪心算法问题。我可以解决大多数问题,但不能确切地找出贪婪在问题中的应用。针对这些问题,我编写了我能想到的唯一解决方案,并得到了接受。社论也显示了同样的解决问题的方法,但我不能理解贪婪范式在算法中的应用。

贪心算法是解决特定范围问题的唯一方法吗?或者它们是一种更有效的解决问题的方法?

你能给我一个同样的问题的伪代码,有没有贪心范式的应用?

现实生活中有很多贪婪算法的例子。其中一个明显的问题是硬币兑换问题,为了兑换某种货币,我们反复分配最大的面额,因此,要兑换17美元61美分的零钱,我们会开出一张10美元的纸币,一张5美元的纸币,两张1美元的纸币,两个25美分的纸币,一个一角硬币和一个便士。通过这样做,我们可以保证最小化纸币和硬币的数量。这个算法并不适用于所有的货币体系……这里

我认为总是有另一种方法来解决问题,但有时,正如你所说,它可能会效率较低。

例如,你总是可以检查所有选项(硬币排列),存储结果并选择最好的,但当然效率很糟糕。

希望能有所帮助。

贪心算法只是迭代构造/改进解的一类算法。

想象一下最著名的问题——TSP。你可以将其表述为整数线性规划问题,并将其交给ILP求解器,它将为你提供全局最优解(如果有足够的时间)。但你可以用贪婪的方式来做。你可以构造一些解决方案(例如随机),然后寻找改进你的解决方案的变化(例如切换两个城市的顺序),然后你继续做这些变化,直到没有这样的变化可能。

因此,底线是:贪婪算法只是一种有效地解决困难问题的方法(在时间上,但在解决质量上不一定),但是还有其他类型的算法可以解决这类问题。

对于硬币,贪心算法也是最优算法,因此"贪心"不像其他问题那样明显

在某些情况下,您更喜欢解决方案,这不是最好的解决方案,但您可以更快地计算它(例如,计算真正的最佳解决方案可能需要数年)。

然后你选择启发式,它应该给你最好的结果-基于平均输入数据,它的结构和你想要完成的。

在维基百科上,有一个很好的解决方案来寻找树

中的最大数字和

假设在这棵树中有2^1000个节点。为了找到最优解,你必须访问每个节点一次。今天的个人电脑在你的有生之年是无法做到这一点的,因此你需要一些启发。而贪心算法只需1000步(不超过1毫秒)就能找到解决方案

最新更新