贪心算法解决会议安排问题
文章目录
前言
一、什么是贪心算法?
贪心算法的基本概念:贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义上的局部最优选择。
二、会议安排题目
1.题目理解
2.思路剖析
总结
前言
本文将主要介绍贪心算法需要注意的地方以及基本概念,理解和解决最经典的会议安排问题,以及有相应的变形题
一、什么是贪心算法?
-
贪心算法的基本概念:贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义上的局部最优选择。
- 贪心算法的基本要素:
- 最优子结构性质:一个问题的最优解包含其子问题的最优解。
- 贪心选择性质:在每一步选择中都采取当前状态下的最优选择,即不考虑未来的影响,仅考虑当前步的选择,从而希望最终能够找到全局最优解。
二、会议安排题目
1.题目理解
这里我们需要根据活动的开始和结束时间来安排最多的活动数目,前提是这里只有一个会场并且时间也只有一天,对于安排活动,根据日常的生活经验,我们可以想到有下面三种安排方式:
- 先来先服务:谁开始的时间早就安排谁
- 最短作业时间优先:谁占用会场的时间少就先安排谁
- 截止时间优先:谁结束的早就先安排谁
下面我们来逐一分析:
如果采用第一种方式,第一个开始的活动占用了很长的时间就会导致后面的活动都无法安排,很多时候并不能满足活动数最多
如果采用第二种方式,假如最晚开始的活动占用会场的时间最少,那么前面的时间都相当于浪费了,也不是一个好的选择
而第三种方式根据结束时间的早晚来安排能够最大程度的未为后面的活动腾出时间,故此类会议安排题目我们都是利用截止时间优先的方式进行安排
2.思路剖析
由上面的题目理解易知我们需要知道活动的开始时间、截止时间并且根据截止时间对活动进行排序。这里我们需要定义两个数组 si 和 fi 分别存储第 i 个活动的开始时间和截止时间,下面我们通过一个列题梳理代码思路。
如图所示,我们首先根据截止时间进行排序,然后我们选择第一个活动最先开始,这时我们发现第一个活动的截止时间是7与第二个活动发生冲突(不相容)则我们要将这个活动去掉,再选择开始时间大于第一个活动的截止时间的活动也就是第三个活动,同理安排好第三个活动,我们也要将冲突的活动剔除,依次类推我们可以选择1、3、5或者1、3、6这两种安排方式,通过这个例题也说明了贪心算法的最优解是不唯一的
下面是这个过程的核心代码:
void GreedySelector(int n, int s[],int f[],bool A[]) { A[1]=true;//安排第一个活动int j=1;//当前结束活动的下标for(int i=2;i<=n;i++){if(s[i]>f[j]){A[i]=true;//将活动列入安排中j=i;//更新当前结束的活动}elseA[i]=false; }}
总结
本文通过贪心算法解决了经典的会议安排问题,即在有限的会议室资源下安排尽可能多的互不冲突的活动。首先,我们定义开始时间和结束时间两个关键数组。然后采用贪心算法的策略,按照活动结束时间进行排序,确保每次选择最早结束的活动,从而为后续活动留出更多时间。在具体实现中,使用标志数组来跟踪已安排的活动,并通过迭代选择兼容活动来完成最优安排。通过示例分析,我们验证了该算法能够正确计算出最多可安排的活动数量及其具体组合。这种基于贪心选择的方法不仅保证了解决方案的最优性,还具有较高的执行效率(O(n log n)时间复杂度),非常适合处理此类活动调度问题。
喜欢的朋友们点赞支持一下啦~