算法理论之贪婪算法和动态规划
本篇文章,简单的介绍一下贪婪算法和动态规划,因本人是算法渣渣,因此权当大家看个热闹。
贪婪算法
一个简单的问题:公司有N个同等级的会议需要使用同一个会议室,现在给你这个N个会议的开始和结束
时间,你怎么样安排才能使安排最多场次的会议?
大家先花两分钟,脑海里面梳理一下解题思路。
思路1:优先安排会议时间最短的能不能行?
比如时间是8-12点,会议1是9点半到10点半(1个小时),会议2从8点到10点(2个小时),会议3从10点到11点30分(1.5个小时),此时如果优先安排最短的会议,你会发现只能安排一场(会议1),但实际上会议2和会议3也能安排下去。
思路2:优先安排最早开始的会议能不能行?
这个我想相信不用举例子你就能明白,肯定是不得行的。
思路3:优先安排会议结束时间最早的能不能行?
优先安排会议结束时间最早的,那么首先将所有会议按照结束时间排序,结束时间越早的约优先安排,这样我不管以后还能不能安排会议,我只管越早结束,留下的时间就越多,能安排的会议就越多。这种是可行的,你可以多举例来证明。
我们用代码实现这个会议调度功能:
/**
* 会议调度问题
*
* 有一会议室,可接受早上8点到晚上6点这个时间段的会议,现有若干场会议需要召开
* 问,如何安排会议才能让召开的会议场次最多?
*
* 贪心算法,局部最优解推导出全局最优。
* 特点:在一定的限制中,求最值。
* 套路:一定有个一排序
*
*
* 解决思路:
* 如果先召开最早结束的会议,那么剩下的时间也就越多,能够召开的会议也就越多。
* 这样将会议进行排序,结束时间从小到大排序。
*
*/
public class MeetingSchdule {
public static void schedule(List<Meeting> meetings, int minTime, int maxTime){
if (meetings==null || meetings.isEmpty()) {
return;
}
//结束时间从小到大排序
meetings.sort((o1, o2) -> o1.endTime > o2.endTime ? 1 : -1);
final int[] curIdleBeginTime = {
minTime}; //当前会议室空闲的开始时间点
meetings.forEach(meeting -> {
if(meeting.startTime >= curIdleBeginTime[0]){
System.out.println("举行会议:"+meeting);
curIdleBeginTime[0] = meeting.endTime;
}
});
}
public static void main(String[] args) {
List<Meeting> meetings = new ArrayList<>();
meetings.add(new Meeting(1, 8,9));
meetings.add(new Meeting(2, 9,10));
meetings.add(new Meeting(4, 9,11));
meetings.add(new Meeting(5, 11,12));
meetings