【问题】设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源(如演讲会场),而在同一时间内只有一个活动能使用这一资源。每个活动  都有一个要求使用该资源的起始时间  和一个结束时间 ,且 <。如果选择了活动  ,则它在半开时间区间 [) 内占用资源。若区间 [) 与区间 [) 不相交,则称活动  与活动  是相容的。也就是说,当  ≥ ,或  ≥ 时,活动  与活动  相容。活动安排问题(activity arrangement problem)要求在所给的活动集合中选出最大的相容活动子集。

【想法】贪心法求解活动安排问题的关键是如何选择贪心策略,使得按照一定的顺序选择相容活动,并能够安排尽量多的活动。至少有以下两种看似合理的贪心策略。

(1)最早开始时间:这样可以增大资源的利用率。

(2)最早结束时间:这样可以使下一个活动尽早开始。

由于活动占用资源的时间没有限制,因此,后一种贪心选择更为合理。直观上,按这种策略选择相容活动可以为未安排的活动留下尽可能多的时间,也就是说,这种贪心选择的目的是使剩余时间段极大化,以便安排尽可能多的相容活动。 
        为了在每一次贪心选择时快速查找具有最早结束时间的相容活动,可以将  个活动按结束时间非减序排列。这样,贪心选择时取当前活动集合中结束时间最早的活动就归结为取当前活动集合中排在最前面的活动。

例如,设有11个活动等待安排,这些活动按结束时间的非减序排列如下表所示。

1 2 3 4 5 6 7 8 9 10 11
1 3 0 5 3 5 6 8 8 2 12
4 5 6 7 8 9 10 11 12 13 14

贪心法求解活动安排问题的过程如下图所示,其中阴影长条表示该活动已加入解集合中,空白长条表示该活动是当前正在检查相容性的活动。首先选择活动 1 加入解集合,因为活动 1 具有最早结束时间;活动 2 和活动 3 与活动 1 不相容,所以舍弃它们;活动 4 与活动 1 相容,因此将活动 4 加入解集合;然后在剩下的活动中找与活动 4 相容并具有最早结束时间的活动,依此类推。最终被选定的活动集合为{1,4,8,11}。 

【算法】设有 n 个活动等待安排, 表示活动  的起始时间, 表示活动  的结束时间( 1 ≤  ≤  ),集合 B 存放问题的解,即选定的活动集合,算法如下。

输入: 个活动的开始时间 {,...,} 和结束时间 {,...,}

输出:选定的活动集合

1.对 {,...,} 按非减序排序,同时相应地调整 {,...,};

2.最优解中包含活动 1:B = {1};

3. = 集合 B 中最后结束的活动,初始时  = 1;

4.循环变量  从 2~ 依次考察每一个活动:

4.1  如果 (  > =  )则)

4.1.1  B=B 十 {  } ,

4.1.2   =  ;

4.2  ++。

【算法分析】在算法中,步骤 1 将各个活动按结束时间从小到大排序,其时间代价是;步骤 4 依次考察每一个活动,其时间代价是,因此,算法的时间复杂性为

【算法实现】假设各活动的起始时间和结束时间存储在数组 s[ n ]和 f[ n ] 中且按结束时间非减序排列,数组 B[ n ] 存储活动的安排信息,若活动  可以安排,则 B[ i ] = 1,注意数组下标从0开始,贪心法求解活动安排问题的算法用 JAVA 语言描述如下:

public class ActiveManage {public static void main(String[] args) {int n = 11;int [] s = new int[]{1,3,0,5,3,5,6,8,8,2,12};int [] f = new int[]{4,5,6,7,8,9,10,11,12,13,14};int [] B =new int[n];ActiveManage activeManage = new ActiveManage();int k = activeManage.ActiveManage(s, f, B, n);System.out.println("最多可安排的活动个数是:"+k);System.out.println("具体的活动是:");for (int i = 0; i < n; i++)if (B[i] == 1)System.out.println("活动"+i);}int ActiveManage(int s[ ], int f[ ], int B[ ], int n){int i, j, count;B[0] = 1;                              //安排活动1j = 1; count = 1;for (i = 1; i < n; i++)                    //依次考察每一个活动{if (s[i] >= f[j]) {             //活动i与集合B中最后结束的活动j相容B[i] = 1;                    //安排活动ij = i;                       //j是目前可以安排的最后一个活动count++;}else B[i] = 0;}return count;                          //返回已安排的活动个数}
}

运行结果如下:

from:算法设计与分析(第2版)——王红梅 胡明 编著——清华大学出版社

算法设计与分析——活动安排问题(Java)相关推荐

  1. 计算机算法设计与分析 工作安排问题

    问题描述:设有n件工作分配给n个人,将工作i分配给第j个人所需的费用为cij.试设计一个算法,为每个人都分配一件不同的工作,并使得总费用达到最小. 输入:第1行有1个正整数n(1≤n≤20),接下来的 ...

  2. java实现 库鲁斯卡尔算法 kruskal(算法设计与分析作业)

    java实现 库鲁斯卡尔算法kruskal(算法设计与分析作业) package package1;import java.util.Arrays;public class alg {//判断tar是 ...

  3. 算法设计与分析——淘汰赛冠军问题(Java)

    [问题]假设有  个选手进行竞技淘汰赛,最后决出冠军的选手,请设计竞技淘汰比赛的过程. [想法]竞技淘汰比赛最自然的想法是将所有选手分成两部分,每部分决出胜者后,让这两个胜者进行比赛,再决出最后的冠军 ...

  4. 【算法设计与分析】经典常考三十三道例题AC代码

    ❥小虾目前大三,我校在大一下开设<数据结构>这门课,大二上开了<算法设计与分析>这门课,很庆幸这两门课的上机考试总成绩一门100,一门99,最后总分也都90+.下文会给出机试的 ...

  5. 算法设计与分析: 4-27 登山机器人问题

    4-27 登山机器人问题 问题描述 登山机器人是一个极富挑战性的高技术密集型科学研究项目,它为研究发展多智能体系统和多机器人之间的合作与对抗提供了生动的研究模型. 登山机器人可以携带有限的能量.在登山 ...

  6. 计算机算法设计与分析(第4版) 王晓东 著 2012.2 笔记(这本书还不错,偏实用、有难度)

    计算机算法设计与分析(第4版) 目录 1 算法概述 2 递归与分治策略 3 动态规划 4 贪心算法 5 回溯法 6 分支限界法 7 随机化算法 8 线性规划与网络流 算法概述 复杂性分析 NP-完全性 ...

  7. 计算机算法设计与分析教学大纲,算法设计与分析的教与学(教学大纲)

    原标题:算法设计与分析的教与学(教学大纲) 课程代码:**** 课程负责人: **** 课程中文名称:算法设计与分析 课程英文名称:Designand Analysis of Algorithms 课 ...

  8. 算法设计与分析: 5-19 世界名画陈列馆问题

    5-19 世界名画陈列馆问题 问题描述 世界名画陈列馆由 m×nm×n m \times n 个排列成矩形阵列的陈列室组成.为了防止名画被盗,需要在陈列室中设置警卫机器人哨位.每个警卫机器人除了监视它 ...

  9. 算法设计与分析-----贪心法

    算法设计与分析-----贪心法(c语言) 一.贪心法 1.定义 2.贪心法具有的性质 1.贪心选择性质 2.最优子结构性质 3.贪心法的算法框架 5.求解活动安排问题 6.求解最优装载问题 二. 贪心 ...

最新文章

  1. linux awk语法格式,Awk是什么?一文带运维小白快速掌握Linux Awk用法
  2. hadoop学习--数据排序
  3. CAN总线很难吗?CAN总线看不懂是不可能的!
  4. 年末盘点,2021年最值得推荐的10个提高开发效率工具,程序员必备
  5. 苹果全面开放漏洞奖励计划:最高100万美元等你拿
  6. Python使用C++动态库的方法
  7. JPA用TABLE生成主键
  8. 每天一个Linux命令(3):ls命令
  9. Mac Python第三方库安装
  10. Hi,大家好,这里是iOS用的 Flash 播放器 FlashViewer
  11. 五十个html js特效动画,基于mo.js制作的17种炫酷图标动画特效
  12. Debian11安装MySql8
  13. 87.假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导的*号之外,将串中其他*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。
  14. DFS回溯-函数递归-xiaoz triangles
  15. 八皇后问题及其解决方案
  16. 中国足球如何才能捧起大力神杯
  17. KKS1(生产订单计算-计算差异)时 常见差异问题
  18. 谷歌公开了内部管理Infra层的两个工具的Paper
  19. 21 张图总结我的 2020 年
  20. 在 GitHub 上利用 SHA-1 值(commit ID)搜索某一次的提交内容

热门文章

  1. 简单的排版技巧让你的曲谱更加美观
  2. 中考计算机vb试题及答案,2017计算机二级VB练习题附答案
  3. js导出excel数据,图片,身份证号码
  4. STM8S103 105唯一序列码的读取
  5. 前端工程化之模块化基础
  6. python替换excel字符串_【Python代替Excel】9:列表、字符串、字典、推导式
  7. 【音视频】音视频自研对比
  8. python合并ts文件教程
  9. 分布式FFMPEG转码集群
  10. Tensorflow2.0+Anaconda + Windows10+cuda10.0+python3.7+spyder安装教程