前言
贪心算法、分治算法、回溯算法、动态规划这 4 个算法思想,原理解释起来都不难,但是要真正掌握且灵活应用它们,并不是件容易的事情。确切地说,它们应该算是算法思想,并不是具体的算法,常用来指导我们设计具体的算法和编码等。因此,学习这类算法思想最好的方法是,结合具体的问题,感受这些算法是怎么工作的,是如何解决问题的,在问题中体会这些算法的本质。这比单纯记忆其原理和定义要更有价值。
如何理解“贪心算法”?
首先,我们来学习一下贪心算法(greedy algorithm)。贪心算法有很多经典的应用,比如霍夫曼编码(Huffman Coding)、Prim 和 Kruskal 最小生成树算法、还有 Dijkstra 单源最短路径算法。关于贪心算法的原理,我们先来看一个例子。
假设有一个可以容纳 100kg 物品的背包,可以装各种物品。如下图所示,我们有以下 5 种豆子,每种豆子的总量和总价值都各不相同。为了让背包中所装物品的总价值最大,我们如何选择在背包中装哪些豆子?每种豆子又该装多少呢?

实际上,这个问题很简单,没错,我们只要先算一算每个物品的单价,按照单价由高到低依次来装就好了。单价从高到低排列,依次是:黑豆、绿豆、红豆、青豆、黄豆,所以,我们可以往背包里装 20kg 黑豆、30kg 绿豆、50kg 红豆。这个问题的解决思路显而易见,但它本质上借助的就是贪心算法。结合这个例子,总结一下贪心算法解决问题的基本步骤。
- 第一步,当我们看到这类问题的时候,首先要联想到贪心算法,这类问题一般具有这样的性质:针对一组数据,我们定义了限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大。类比到刚刚的例子,限制值就是重量不能超过 100kg,期望值就是物品的总价值。这组数据就是 5 种豆子。我们从中选出一部分,满足

最低0.47元/天 解锁文章
528

被折叠的 条评论
为什么被折叠?



