贪心算法
顾名思义。贪心算法即是总做出当前看来最好的选择,贪心算法并不是从整体最优考虑,它做出的选择只在某种意义上是局部最优的。
贪心算法的基本要素:
贪心选择性质;所谓贪心选择性质是指所求问题的整体最优可以通过一系列的局部最优的选择,即是贪心选择来完成。
最优子结构性质:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是问题是否可以通过动态规划算法或者贪心算法求解的关键特征。
贪心算法和动态规划算法的差异:贪心算法和动态规划算法都是求解问题具有最优子结构性质,这是两者之间的共同点,但是两者还是具有差异的。
例:
0-1背包问题与背包问题:
0-1背包问题:给定n种物品和一个背包。物品i的重量是wi,其价值为vi,背包的容量为C,应如何选择装入背包的物品,使得装入背包的物品总价值最大?在选择装入的物品时,物品只能选择是否装入,不能将物品装入多次,也不能装入一部分。
背包问题:类似于0-1背包问题,但是物品可以装入一部分。
两者都是具有最优子结构性质的,0-1背包问题,只能使用动态规划算法,背包问题可以贪心算法计算。
贪心算法计算解背包问题的基本步骤是:首先计算每个物品的单位重量的价值vi/wi,然后依据贪心选择策略,将尽可能多的单位重量高价值物品装入背包。直到装满为止。
贪心算法可以解决的问题有
活动安排问题
最优装载
哈夫曼编码
单源最短路径
最小生成树