本博客所有内容均整理自《算法图解》,欢迎讨论交流~
相信大家都或多或少地听说或者接触过贪婪算法,当我们遇到一个没有办法解决的问题时,贪婪算法总是一个现成的好思路。
对于贪婪算法的定义,百度百科是这样说的:
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
其实说白了,就是在当前状态下找到局部最优解,然后在此基础上再去寻找局部最优解,通过多次寻找局部最优解直至收敛的过程来代替寻找全局最优解。
但是,这种思路有可能最终获得的并不是全局最优解!
1、贪婪算法的两个例子
首先,我们通过两个例子来看看贪婪算法的具体操作步骤和效果。
第一个例子:
假设有如下课程表,你希望将尽可能多的课程安排在某一间教室内。很明显,你无法将所有课都安排在这一间教室内,因为这些课程的时间有所冲突,那么最优的安排策略是怎样的呢?
我们希望在同一间教室上尽可能多的课,但是现在课程时间错综复杂,彼此交叉。
要想解决这个问题,我们就可以启用贪婪算法。具体步骤如下:
- 选出结束最早的课,它就是要在这间教室上的第一堂课。
- 接下来,必须选择第一堂课结束后才开始的课。此时,我们同样选择结束最早的课,这将是在这间教室上的第二堂课。
- 依此类推地重复,直到没有其他课可以安排了。
根据以上的贪婪算法,我们很快就可以选出要在这间教室内上的课程,如下图所示:
具体时间安排如下所示:
这样就获得了最优的课程安排选择!所以贪婪算法只要用对了地方,就显得非常直观和简单!
对于上面的例子,我们使用贪婪算法的总体思路其实很简单,就是每一次都选择满足条件的局部最优解,即每次都选择在上一节课结束之后开始的结束最早的课。