贪心算法解决会议安排问题

文章目录

前言

一、什么是贪心算法?

贪心算法的基本概念:贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义上的局部最优选择。

二、会议安排题目

1.题目理解

2.思路剖析

总结



前言

本文将主要介绍贪心算法需要注意的地方以及基本概念,理解和解决最经典的会议安排问题,以及有相应的变形题


一、什么是贪心算法?

贪心算法的基本概念:贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义上的局部最优选择。
  1. 贪心算法的基本要素:
  • 最优子结构性质:一个问题的最优解包含其子问题的最优解。
  • 贪心选择性质:在每一步选择中都采取当前状态下的最优选择,即不考虑未来的影响,仅考虑当前步的选择,从而希望最终能够找到全局最优解**。**

二、会议安排题目

1.题目理解

这里我们需要根据活动的开始和结束时间来安排最多的活动数目,前提是这里只有一个会场并且时间也只有一天,对于安排活动,根据日常的生活经验,我们可以想到有下面三种安排方式:

  • 先来先服务:谁开始的时间早就安排谁
  • 最短作业时间优先:谁占用会场的时间少就先安排谁
  • 截止时间优先:谁结束的早就先安排谁

下面我们来逐一分析:

如果采用第一种方式,第一个开始的活动占用了很长的时间就会导致后面的活动都无法安排,很多时候并不能满足活动数最多

如果采用第二种方式,假如最晚开始的活动占用会场的时间最少,那么前面的时间都相当于浪费了,也不是一个好的选择

而第三种方式根据结束时间的早晚来安排能够最大程度的未为后面的活动腾出时间,故此类会议安排题目我们都是利用截止时间优先的方式进行安排

2.思路剖析

由上面的题目理解易知我们需要知道活动的开始时间、截止时间并且根据截止时间对活动进行排序。这里我们需要定义两个数组 si 和 fi 分别存储第 i 个活动的开始时间和截止时间,下面我们通过一个列题梳理代码思路。

如图所示,我们首先根据截止时间进行排序,然后我们选择第一个活动最先开始,这时我们发现第一个活动的截止时间是7与第二个活动发生冲突(不相容)则我们要将这个活动去掉,再选择开始时间大于第一个活动的截止时间的活动也就是第三个活动,同理安排好第三个活动,我们也要将冲突的活动剔除,依次类推我们可以选择1、3、5或者1、3、6这两种安排方式,通过这个例题也说明了贪心算法的最优解是不唯一的

下面是这个过程的核心代码:

cs 复制代码
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;//更新当前结束的活动
        }
        else
            A[i]=false;
}

}

总结

本文通过贪心算法解决了经典的会议安排问题,即在有限的会议室资源下安排尽可能多的互不冲突的活动。首先,我们定义开始时间和结束时间两个关键数组。然后采用贪心算法的策略,按照活动结束时间进行排序,确保每次选择最早结束的活动,从而为后续活动留出更多时间。在具体实现中,使用标志数组来跟踪已安排的活动,并通过迭代选择兼容活动来完成最优安排。通过示例分析,我们验证了该算法能够正确计算出最多可安排的活动数量及其具体组合。这种基于贪心选择的方法不仅保证了解决方案的最优性,还具有较高的执行效率**(O(n log n)时间复杂度)**,非常适合处理此类活动调度问题。

喜欢的朋友们点赞支持一下啦~

相关推荐
吃好睡好便好1 小时前
查找函数的使用
学习·算法·matlab·生活·查找函数
学习星球1 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
靠沿2 小时前
贪心算法专题(二)
算法·贪心算法
猎头南楼3 小时前
具身智能模型部署方向的能力要求与技术栈梳理
人工智能·深度学习·算法
啥都想学点的研究生4 小时前
一篇文章讲清楚:线性回归问题的求解——正规方程法
算法·机器学习·线性回归
青少儿编程课堂4 小时前
树状数组精讲:逆序对计数与离散化(附双语言解法)
算法·树状数组·离散化·信息学奥赛·逆序对
血小板要健康4 小时前
网格 dfs 与 FloodFill:从岛屿、区域到搜索路径
笔记·算法·leetcode·深度优先
VALENIAN瓦伦尼安教学设备5 小时前
设备状态检测振动分析实训台案例分析
大数据·数据库·人工智能·嵌入式硬件·算法
小小晓.5 小时前
C++ 值类别与完美转发深度剖析:从左值右值到 std::forward 源码解密
开发语言·c++·算法
怕浪猫5 小时前
用了两年 AI 编程工具后,我重新理解了什么是「资深工程师」
算法·面试·架构