当前位置: 首页 > ds >正文

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

文章目录

前言

一、什么是贪心算法?

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

二、会议安排题目

1.题目理解

2.思路剖析

总结



前言

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


一、什么是贪心算法?

  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)时间复杂度),非常适合处理此类活动调度问题。
喜欢的朋友们点赞支持一下啦~

http://www.xdnf.cn/news/3714.html

相关文章:

  • 架构进阶:深入学习企业总体架构规划(Oracle 战略专家培训课件)【附全文阅读】
  • 初始化列表详解
  • 基于SpringBoot的同城宠物照看管理系统
  • stm32 hal库 SPI使用(二)硬件SPI的HAL库函数调用
  • 架构师面试(三十八):注册中心架构模式
  • 数字智慧方案6189丨智慧应急综合解决方案(46页PPT)(文末有下载方式)
  • Linux操作系统系统编程:x86-64架构下的系统调用
  • 数字智慧方案5872丨智慧交通解决方案(54页PPT)(文末有下载方式)
  • 13分区排烟 无法远程启动 12-1-4,排烟管道出口未连接室外
  • vmware虚拟机Linux系统( CentOS7)初始化没有选择Pinyin,无法输入中文(Linux系统输入中文)
  • 计算机网络——客户端/服务端,URI与URL的区别,以及TCP/IP核心机制全解析
  • 红鸟3D互动系统棋类源码一键部署教程(含多个打包版本与功能解构)
  • C++ 赋值运算符重载详解
  • 全局分割与实例分割技术对比:U-Net与Mask R-CNN
  • Python项目源码69:一键解析+csv保存通达信日线数据3.0
  • C++map和set
  • linux指令中的竖线(“|”)是干啥的?【含实例展示】
  • HTTP 状态码详解:用途与含义
  • QMK固件中LED指示灯与RGB灯详解指南
  • MySQL初阶:数据库基础,数据库和表操作,数据库中的数据类型
  • 组件通信-自定义事件
  • 基于SpringBoot+Vue实现的电影推荐平台功能一
  • SpringBoot基础(原理、项目搭建、yaml)
  • 【quantity】6 温度单位实现(temperature.rs)
  • wfp CommandParameter 详细解说
  • 数字智慧方案6190丨智慧应急综合平台解决方案(49页PPT)(文末有下载方式)
  • 开发规范-Restful
  • Android面试总结之jet pack模块化组件篇
  • GoogleTest:TEST_F
  • Proxmox VE 8.4 显卡直通完整指南:NVIDIA 2080 Ti 实战