如何理解贪心算法
贪心算法是指在对问题求解时,总是做出当前看来是最好的选择。由于不从整体考虑,所做出的是在某种意义上的局部最优解
贪心算法基本思想
从问题的某一个初始解出发,一步一步进行,根据某个优化测度,每一步都确保能获得局部最优解
每一步只考虑一个数据,若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据都枚举完,或者不能再添加时算法结束
贪心算法解决问题的步骤
- 首先要能想到贪心算法
什么样的问题才适合使用贪心算法?
针对一组数据,定义了限制值和期望值,希望从中选取几个数据,在满足限制条件的情况下,期望值最大。
- 尝试看用贪心算法能不能解决问题
每次都选择在当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据
- 举几个例子看贪心算法产生的结果是否是最优的
注:贪心算法不适用于前面的选择会影响后面的选择的情况
过程步骤:
1、建立数学模型来描述问题
2、把求解问题分成若干个子问题
3、对每一个子问题求解,得到子问题的局部最优解
4、把子问题的局部最优解合成原来问题的一个解
贪心算法经典应用
- 霍夫曼编码 (Huffman Coding)
- 最小生成树算法
- 单源最短路径算法
注: 贪心算法实际的应用场景有限
学习贪心算法最有效的学习方法是多练习
贪心算法最难的是如何将要解决的问题抽象成贪心算法模型
常见面试考题
分苹果 :有m个苹果和n个孩子(m < n),m个苹果大小不同,n个孩子对苹果的大小需求不同,如何分配,让最多数量的孩子得到苹果
贪心算法和动态规划对比
- 相同点
都是一种推导算法
都是分解成子问题来求解,都需要具有最优子结构
- 不同点
1、贪心算法:每一步的最优解一定包含上一步的最优解,上一步之前的最优解不保存
动态规划:全局最优解一定包含某个局部最优解,但是不一定包含上一个局部最优解,因此需要记录之前所有的局部最优解
2、 贪心算法不能保证得到全局最优解,一般复杂度低,动态规划一定可以得到全局最优解,复杂度高