定义
所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。
贪心算法是一种特殊的动态规划算法,不一样的是贪心算法是局部最优解,动态规划是全局最优解。实际上大部分问题无法通过贪心算法获得最优解。
如果对矩阵求解的梯度下降法了解的话,贪心算法就比较好理解。
解释
从前有一只鹅,一天可以下两个金蛋,但是直接杀了他可以拿到二十个金蛋。问在21天内拿到尽量多的金蛋?
动态规划 => 前20天不杀,最后一天杀。40个
贪心算法 => 若第一天下蛋,得到一个金蛋;若第一天杀,得到20个金蛋。则选择第一天杀。
使用说明
贪心算法一般按如下步骤进行:
- 建立数学模型来描述问题
- 把求解的问题分成若干个子问题
- 对每个子问题求解,得到子问题的局部最优解
- 把子问题的解局部最优解合成原来解问题的一个解
解决【情侣牵手】问题
通过不断的交换情侣让情侣坐到一起,那么对于每次交换,有2种情况:
- 交换1次,1对情侣坐到了一起
【A男、B男】、【C男、A女】、【B女、C女】
=>
【A男、A女】、【C男、B男】、【B女、C女】
变换1次,将(B男)与(A女)调换位置,形成【A男、A女】1对情侣
- 交换1次,2对情侣坐到了一起
【A男、B男】、【B女、A女】
=>
【A男、A女】、【B女、B男】
变换1次,将(B男)与(A女)调换位置,形成【A男、A女】、【B女、B男】2对情侣
交换1次,2对情侣坐到了一起【优于】交换1次,1对情侣坐到了一起
因此,每次变换时候对数组进行遍历,查看是否有可以变换1次形成2对情侣,如没有则进行变换1次形成1对情侣,直到捋顺所有情侣。