第三讲 贪心法
1. 贪心法的基本思想
贪心法是从问题的某一个初始解出发,向给定的目标推进。但不同的是,推进的每一步不是依据某一固定的递推式,而是做出一个在当前看来是最佳的贪心选择,不断地将问题实例归纳为更小的相似的子问题,并期望通过所做的局部最优选择产生出一个全局最优解。
2. 使用贪心法求解问题时要具备的条件
(1)所求解的问题应当具有贪心选择性质。即所求解的问题的整体最优解可以通过一系列的局部最优解得到。所以局部最优解是指在当前的状态下做出的最好选择。
(2)所求解的问题应当具有最优子结构性质。当一个问题的最优解包含着它的子问题的最优解时,称此问题具有最优子结构。
3. 使用贪心法的注意事项
(1)要判断一个问题是否可以通过贪心算法得到最优解,是一件比较困难的的事情。这需要比较复杂而严格的数学证明。
(2)贪心算法不是对所有问题都能得到整体的最优解,但是实际应用中的许多问题都可以使用贪心算算得到最优解。
(3)即使使用贪心算法不能得到问题的最优解,但是最终结果也是最优解的很好的近似解。因此,在解决一般性问题时,使用贪心算法是一种不错的选择。
4. 贪心法的优点与不足
优点:算法思想简单,易于实现,效率高。
不足:使用贪心算法之前必须对问题本身进行深入而透彻地分析和证明,以保证使用贪心法得到最优解,而对问题进行分析与证明是比较困难的。
5. 贪心法在经典算法中的体现
(1)哈夫曼(Huffman)编码问题:编码最短
(2)求解最小生成树的克鲁斯卡尔(Kruskal)算法和普里姆(Prim)算法:代价最小
(3)求解图的最短路径的迪克斯特拉(Dijkstra)算法:路径最短
6. 举例
例1:找零钱问题。假设有3种硬币,面值分别为1元、五角、1角。这3种硬币各自的数量不限,现在要找给顾客2元7角钱,请问怎样找钱才能使得找给顾客的硬币数量最少呢?
分析:为了找给顾客的硬币数量最少,在选择硬币的面值时,当然是尽可地选择面值大的硬币。因此要找给顾客2元7角钱,且使得硬币数量最少,应该按照以下步骤: