------ 本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程 ------
今天来学习贪心算法(greedy algorithm)。贪心算法有很多经典的应用,比如霍夫曼编码(Huffman Coding)、Prim 和 Kruskal最小生成树算法、还有 Dijkstra 单源最短路径算法。最小生成树算法和最短路径算法我们后面会讲到。今天来看下,霍夫曼编码,它是如何利用贪心算法来实现对数据压缩编码,有效节省数据存储空间的。
如何理解“贪心算法”
先看一个例子,假设我们有一个可以容纳100kg物品的背包,可以装各种物品。我们有以下5种豆子,相差总量和总价如下图。为了让背包中所装物品总价最大,我们如何选择在背包中装哪些豆子?每种豆子双该装多少?
这个很多简单,现实中你也会这么做,算出单价后,装单价最高的。也就是往背包里装20kg黑豆、30kg绿豆、50kg红豆。
这个总量的解决思路显而易见,它本质上借助贪心算法。结合这个例子,我总结一下贪心算法解决总量的步骤。
第一步,当我们看到这类问题的时候,首先要联想到贪心算法:会对一组数据,我们定义限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大。
类比刚刚的例子,限制值就是重量不超过100kg,期望值就是物品的总价值。这级数据