贪心算法(Greedy Algorithm)
Ⅰ 前言
贪心算法(Greed Algorithm)的思想其实是生活中一个很常用的思想,贪心算法本身也有很多经典的应用,比如哈夫曼编码(Huffman Coding)、Prim 和 Kruskal 最小生成树算法、Dijkstra 单源最短路径算法。最小生成树和最短路径在我后面的文章中会介绍,哈夫曼编码在我之前的文章中也讲过了,今天我们再从贪心算法的角度来看看。
【数据结构与算法】->数据结构->哈夫曼树->哈夫曼编码&解码
Ⅱ 贪心算法的理解
关于贪心算法,我们先看一个例子。
假设我们有个可以容纳 100kg 物品的背包,可以装各种物品。我们有以下 5 种豆子,每种豆子的总量和总价值都各不相同,为了让背包中所装物品的价值最大,我们要如何选择在背包中装哪些豆子,每种豆子又该装多少呢?
实际上,这个问题不是很复杂,我们只要先计算一下每个物品的单价,按照单价由高到低来排序,然后就按这个顺序装就好了。单价从高到低排列为:黑豆、绿豆、红豆、青豆、黄豆。所以,我们可以往背包里装 20kg 黑豆,30kg 绿豆,50kg 红豆。
这个问题解决思路还是比较容易想到的,它本质借助的就是贪心算法。结合这个例子,我总结一下贪心算法解决问题的步骤。
第一步,当我们看到这类问题的时候,首先要联想到贪心算法:针对一组数据,我们定义了限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大。
对应到我们举的例子中,限制值就是重量不能超过 100kg,期望值就是物品的总价值。这组数据就是 5 种豆子,我们从中选出一部分