【算法】区间调度算法

目录

  • 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) 这篇文章中的区间问题章节。如果大家发现文章中的错误之处,可在评论区中指出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/153869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rosnode ping指令

节点是一个可执行文件&#xff0c;它可以通过ROS来与其他节点进行通信(这些节点可以分布在不同设备上面的软件直接&#xff0c;例如一台在Windows上面&#xff0c;一台在Ubuntu&#xff0c;一台在stm32上面) 节点是ROS中非常重要的一个概念&#xff0c;为了帮助初学者理解这个…

springboot中动态api如何设置

1.不需要编写controller 等mvc层&#xff0c;通过接口动态生成api。 这个问题&#xff0c;其实很好解决&#xff0c;以前编写接口&#xff0c;是要写controller&#xff0c;需要有 RestController RequestMapping("/test1") public class xxxController{ ApiOperat…

敏捷DevOps专家王立杰:端到端DevOps持续交付的5P法则 | IDCF

今天有一个流行的英文缩写词用来刻画这个风云变幻的时代&#xff1a;VUCA&#xff08;乌卡时代&#xff09;。四个英文字母分别表示动荡性&#xff08;Volatility&#xff09;、不确定性&#xff08;Uncertainty&#xff09;、复杂性&#xff08;Complexity&#xff09;和模糊性…

JavaScript-如何使用变量

更多内容&#xff0c;请访问&#xff1a; 声明和定义区别 JavaScript-变量类型 JavaScript-变量类型判断 JavaScript-undefined和null区别 变量定义 变量的定义&#xff0c;可以通过var、const、let来定义&#xff0c;let和const是ES6新特性&#xff0c;let和const是解决var…

C编译流程

1.预处理 hello.c 经过预处理得到 hello.i gcc -E hello.c -o hello.i -E的含义&#xff1a;说明这是一个预处理操作 生成预处理文件(.i) 预处理阶段做了什么事&#xff1a; 1.1 头文件展开 我们发现 原先只有几行的hello.c变成了上千行的hello.i 实际上 预处理完成的是 将头…

Unity中Shader反射环境

文章目录 前言一、制作反射环境的两种办法法1&#xff1a;属性面板接收一个 Cubemap 作为反射环境法2&#xff1a;把环境烘焙成一张Cubemap 二、在Unity中实现把环境烘焙成一张Cubemap1、先创建一个反射探针&#xff08;可以直接创建&#xff0c;也可以空物体增加组件&#xff…

【Linux】:进程间通信和日志模拟

进程间通信 一.基本概念二.简单的通信-管道(匿名管道)1.建立通信信道2.通信接口 三.命名管道三.模拟命名管道通信&#xff08;加上日志&#xff09;1.完整代码2.基本使用 一.基本概念 是什么 两个或多个进程实现数据层面的交互。 因为进程独立性的存在&#xff0c;导致进程间…

广度优先算法(BFS)

广度优先算法&#xff08;Breadth-First Search&#xff09;是在图和树领域的搜索方法&#xff0c;其核心思想是从一个起始点开始&#xff0c;访问其所有的临近节点&#xff0c;然后再按照相同的方式访问这些临近节点的节点&#xff0c;这种访问方式类似涟漪泛起&#xff0c;一…

HINSTANCE是什么?

HINSTANCE 就是 HMODULE&#xff1a;

队列OJ--循环队列

目录 题目链接&#xff1a;622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09;​​​​​ 题解&#xff1a; ​编辑 代码实现&#xff1a; 完整代码&#xff1a; 题目链接&#xff1a;622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09;​​​​​ 题解&#x…

python 对比数据库,生成sql

import pymysqldef get_table_structure(connection, cursor, database, table):# 获取表结构query f"SHOW COLUMNS FROM {database}.{table}"cursor.execute(query)return cursor.fetchall()def generate_create_table(cursor, table_structure, database, table):…

jenkins传参给robotframework

在做自动化的时候&#xff0c;需要使用jenkins传参给rf&#xff0c;rf根据传来的变量运行&#xff0c;在将变量传递给py脚本文件。特此记录。 一、配置jenkins 构建的命令使用如下格式即可&#xff08;注意空格&#xff09;&#xff1a; cd D:\xxx\test call pybot --variabl…

英语 更新学习英语的过程

吃饭相关 目录 吃饭相关 询问 would 主语 like noun/to do? 询问他人意愿 What would 主语 like ( to do) ? 询 问他人的意愿 餐饮用具 烹饪 询问 would 主语 like noun/to do? 询问他人意愿 Would you like dinner&#xff1f; Would you like meat? Woul…

go语言学习-异常处理

1、异常场景 网络故障硬件故障组件故障输入错误逻辑错误链路调度错误 2、异常处理方式 # python或者java异常处理 try 可能出现的错误 catch对错误进行处理 xxx,err : 代码 if err ! nil {代码出现错误&#xff0c;需要做处理 }3、自定义错误 有两种方法&#xff1a;1、通过…

砖家测评:腾讯云标准型S5服务器和s6性能差异和租用价格

腾讯云服务器CVM标准型S5和S6有什么区别&#xff1f;都是标准型云服务器&#xff0c;标准型S5是次新一代云服务器规格&#xff0c;标准型S6是最新一代的云服务器&#xff0c;S6实例的CPU处理器主频性能要高于S5实例&#xff0c;同CPU内存配置下的标准型S6实例要比S5实例性能更好…

视频剪辑技巧:批量剪辑新篇章,AI智剪来领航

随着数字媒体的飞速发展&#xff0c;视频剪辑已经成为一项重要的工作。在繁忙的工作中&#xff0c;如何高效、准确地完成批量剪辑是一项具有挑战性的任务。近年来&#xff0c;AI智剪的出现为视频剪辑工作带来了新的解决方案&#xff0c;引领着批量剪辑的新篇章。在AI智剪的帮助…

为了摆脱 Android ,亚马逊开发基于Linux的操作系统

导读亚马逊一直在开发一种新的操作系统 —— 内部代号为 “Vega”&#xff0c;以便在 Fire TV、智能显示器和其他联网设备上取代 Android 系统。 亚马逊一直在开发一种新的操作系统 —— 内部代号为 “Vega”&#xff0c;以便在 Fire TV、智能显示器和其他联网设备上取代 Andr…

终于有人把数据资产入表知识地图总结出来了,轻松看懂

在当前数字化的浪潮下&#xff0c;数据已经成为劳动、土地、知识、技术以后的第五大生产要素&#xff0c;“数据就是资源”已成为共识。如今数据资产“入表”已成定局&#xff0c;数据资产化迫在眉睫。 2023年8月21日&#xff0c;财政部正式印发《企业数据资源相关会计处理暂行…

科技的成就(五十三)

503、任天堂首次公开 Switch 2016 年 10 月 20 日&#xff0c;任天堂首次公开 Switch 正式名称及造型。Switch 是任天堂推出的混合型游戏机&#xff0c;可作为家用游戏机&#xff0c;也可作为便携式掌机。Switch 在开发过程中就以代号 NX 而闻名&#xff0c;成为当年的现象级产…

什么样的企业可以使用免费版的CRM?

市面上大部分的免费CRM不需要付费即可使用&#xff0c;但是对于使用人数和功能进行了部分限制。下面我们就来说说&#xff0c;免费CRM的适用对象是谁&#xff1f; 1、初创/小微企业 这种小微企业没有太多的资金&#xff0c;也没有复杂的客户管理需求&#xff0c;仅仅需要一款…