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

【算法】区间调度算法

目录

  • 1.概述
  • 2.代码实现
  • 3.应用

1.概述

(1)区间调度算法 (Interval Scheduling Algorithm) 是一种在给定的一组任务中,选择尽可能多的相互不冲突的任务的算法。在这个问题中,每个任务都有一个开始时间和结束时间。两个任务是相互冲突的,当且仅当它们的时间段有重叠部分。目标是选择最大数量的任务,使得它们不相互冲突。

(2)该问题可以用贪心算法解决,其基本思想是按照任务结束时间的顺序,依次选择结束时间最早的任务,并且保证该任务与之前已选任务不冲突。具体实现步骤如下:

  • ① 将任务按照结束时间从早到晚排序;
  • ② 选择结束时间最早的任务,并将其加入最终结果集合中;
  • ③ 对于剩余任务中与已选任务不冲突的任务,重复步骤 ②,直到没有剩余任务为止。

(3)下面是一个示例:

  • 假设有 5 个任务:(1,3), (2,5), (4,7), (6,9), (8,10),其中每个任务用一对时间表示其起始时间和结束时间。
  • 按照结束时间从早到晚的顺序,它们的排序结果为:(1,3), (2,5), (4,7), (6,9), (8,10)。
  • 根据上述贪心算法,首先选择结束时间最早的任务 (1,3),然后排除掉与该任务冲突的任务 (2,5),接着选择结束时间最早的任务 (4,7),再排除掉与该任务冲突的任务 (6,9),最后选择结束时间最早的任务 (8,10),得到的最终结果集合为 {(1,3), (4,7), (8,10)}。

区间调度算法的时间复杂度为 O(nlogn),其中 n 是任务数量,主要来自于对任务按照结束时间进行排序。

2.代码实现

(1)区间调度算法的代码实现如下:

class Solution {public List<int[]> schedule(int[][] intervals) {//将所有区间按照其右端点的值进行升序排序Arrays.sort(intervals, Comparator.comparingInt(a -> a[1]));//存放选择的区间List<int[]> selected = new ArrayList<>();selected.add(intervals[0]);int end = intervals[0][1];for (int[] interval : intervals) {if (end < interval[0]) {//找到一个与当前区间不相交的区间selected.add(interval);//更新 endend = interval[1];}}return selected;}
}

(2)测试代码如下:

class Test {public static void main(String[] args) {int[][] intervals = {{1, 4}, {2, 3}, {3, 6}, {5, 7}, {6, 8}, {8, 10}};Solution solution = new Solution();List<int[]> selected = solution.schedule(intervals);for (int[] interval : selected) {System.out.println(Arrays.toString(interval));}}
}

输出结果如下:

[2, 3]
[5, 7]
[8, 10]

3.应用

(1)区间调度算法的应用场景包括:

  • 会议安排问题:有多个会议需要在同一天内安排,但每个会议的时间可能重叠。现在需要找到一种方案,使得尽可能多的会议都可以被安排,并且每个时间段只能安排一场会议。
  • 老师安排课程表问题:有多位老师需要在同一时间段上课,但每位老师的课程可能存在时间上的重叠。现在需要找到一种方案,使得尽可能多的老师都可以安排课程,并且每个时间段只能安排一位老师的课程。
  • 医生安排手术问题:医院有多名医生需要在同一时间段进行手术,但每名医生手术的时间可能存在重叠。现在需要找到一种方案,使得尽可能多的医生都可以进行手术,并且每个时间段只能安排一名医生的手术。

以上仅是应用场景的一部分,区间调度算法还可以应用于其他需要优化时间资源利用的问题。

(2)大家可以去 LeetCode 上找相关的区间调度算法的题目来练习,或者也可以直接查看 LeetCode 算法刷题目录 (Java) 这篇文章中的区间问题章节。如果大家发现文章中的错误之处,可在评论区中指出。

相关文章:

  • mysql5.6 修改密码
  • python运行hhsearch二进制命令的包装器类
  • Kafka、RocketMQ、RabbitMQ的比较总结Kafka、RocketMQ、RabbitMQ的比较总结
  • 【开源】基于JAVA的社区买菜系统
  • Golang基础-面向过程篇
  • [算法学习笔记](超全)概率与期望
  • BUG:编写springboot单元测试,自动注入实体类报空指针异常
  • 深入分析TaskView源码之触摸相关
  • Docker发布简单springboot项目
  • 实战项目:VB龟兔赛跑游戏+猜数字游戏
  • 【PyQt小知识 - 3】: QComboBox下拉框内容的设置和更新、默认值的设置、值和下标的获取
  • 在 Windows 中关闭 Nginx 所有进程
  • 基于Towers of Binary Fields的succinct arguments
  • OpenCV 卷积运算和卷积核
  • 抖音如何推广引流?抖音推广引流的经验与工具分享
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • chrome扩展demo1-小时钟
  • gcc介绍及安装
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • js数组之filter
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Linux Process Manage
  • Octave 入门
  • spark本地环境的搭建到运行第一个spark程序
  • web标准化(下)
  • 第2章 网络文档
  • 类orAPI - 收藏集 - 掘金
  • 全栈开发——Linux
  • 手机端车牌号码键盘的vue组件
  • 2017年360最后一道编程题
  • elasticsearch-head插件安装
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #includecmath
  • #LLM入门|Prompt#3.3_存储_Memory
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1)Android开发优化---------UI优化
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (安卓)跳转应用市场APP详情页的方式
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (五)网络优化与超参数选择--九五小庞
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .form文件_一篇文章学会文件上传
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Standard 的管理策略
  • .NET框架
  • /var/log/cvslog 太大
  • @SpringBootApplication 包含的三个注解及其含义
  • [<事务专题>]
  • [2544]最短路 (两种算法)(HDU)
  • [Android View] 可绘制形状 (Shape Xml)
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [caffe(二)]Python加载训练caffe模型并进行测试1
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽