一、Interval Scheduling

初学算法设计与分析,老师就讲到了这个比较难的问题,听的时候就似懂非懂。现在搞清楚记录如下。

本问题涉及到的算法:贪心算法(Greedy Algorithm)

1.1 问题描述:

假设我们有多个任务,图中给出了,每个任务的开始时间和终止时间。不同任务不重叠的情况下,求任务的最大组合数。

input:具有起始时间(Si)和终止时间(Fi)的任务集合
goal:不同任务的最大组合数

1.2 问题分析:

分析一个问题,我们首先分析出一个可行的算法,然后再对算法进行优化,尽可能降低复杂度,达到最优的情况。

备选方案:

1、任务按开始时间排序(Si);
2、任务按终止时间排序(Fi);
3、任务按照所用时间长短(Fi - Si)排序;
4、对于每一个任务,计算与它冲突的任务个数Ci,然后对Ci排序。

由于本问题比较简单,我们不过多讨论。容易发现,使用贪心算法,我们按照终止时间排序,可以成功的求解问题。

1.3 问题求解:

首先我们按照终止时间,对任务进行排序,然后依次选择,不重叠的任务,即可求出,最大的任务组合数。

伪代码:
Sort jobs by finish times so that f1 <= f2 <= ... <= fn.
select a task ——>A
for j = 1 to n {if (job j compatible with A)A and {j} ——> A
}
return A

算法复杂度:O(n logn)
其实这个问题是有别的算法的,我们课上同学讨论出一个,老师都惊呆了。老师本来想推翻同学的算法,结果发现,同学的算法非常正确。

二、Weighted Interval Scheduling

在问题一的基础上,稍加修改,问题变难很多,成为带权值的任务调度问题。上课睡觉的后果就是,课上成功听不懂,课下自己想办法。

本问题涉及到的算法:动态规划(Dynamic Programming)

讲真提到动态规划,比较头大,尤其是对于没有算法的基础新手。在此贴上知乎大佬的解释:https://www.zhihu.com/question/23995189

2.1 问题描述:

在问题1的基础上,我们对每个任务增加权值。实际情况下,我们可以认为,我们的任务优先级不同,重要性不同。即使有些任务,用到的时间短,重要性却很高。在这种情况下,我们求解,固定时间内,求完成任务权值和的最大值。

input:具有起始时间(Si),终止时间(Fi)和权值(Wi)的任务集合
goal:任务组合的权值最大值

2.2 问题分析:

首先我们考虑贪心算法,能否用于本问题。容易发现,问题1其实是问题2的权值为1的特例,在权值为1的情况下,贪心算法是可以求解的。若权值是任意值,算法便会失效。从图中我们可以看出,任务b的权值很大,却不会被选出,明显权值和,不是最大。

这里直接说算法,求解吧,毕竟我也不知道到底是怎么想出来的。前人的经验,我们看懂,理解,也算成功了。

2.2 问题求解:

当然,本问题,是可以暴力求解的,也就是枚举(遍历),但这必然复杂度,爆炸,如果都用枚举,我们还学算法有毛用。
这里还需要说下,有两种算法,一种是使用回归算法,另一种Bottom to Up
直接上算法,稍后再解释。
###2.2.1回归算法:

sort:首先我们按照结束时间对任务进行排序;
define:定义一个函数P(i),是指与任务i不重叠的索引最大值,该索引小于i;
OPT(j)=max(Wj+OPT(p(j)),OPT(j−1))

算法伪代码:

首先我们对任务按结束时间排序,这里就不多说了。然后我们定义了一个函数P(i),是指与任务i不重叠的索引最大值,该索引小于i。比如说下图:

当i=8,P(8)也就是,与任务8不重叠的任务索引的最大值,从图中看出是5,所以P(8)=5。
然后我们定义OPT(i)也就是,对于i个任务,该问题的最优解的值。对于j个任务的最优解,我们按照是否选择任务j,可以划分为两种情况。**情况一:**选择任务j,取它的权值Wj,然后往前找与任务j不重叠的任务索引最大值,求OPT(P(j)),然后将二者相加;**情况二:**不选择任务j,选择任务j-1。然后我们比较这两种情况的大小,作为j个任务的最优解。

算法缺陷:
当我们有大量的子问题的时,回归算法需要大量的计算,成为指数问题,算法便会失效。
其实我们这个算法,是从任务的最后一个,依次向前求,需要不停地回归,用到前面的值,同时我们需要不停地存储最优解。
###2.2.2 :Bottom-up dynamic programming

从公式我们可以看出每一个OPT值依赖于前一个值,OPT(p(j))或者是OPT(j-1)。因此,我们能否倒过来,将n的顺序,也就是从第一个开始开始,计算OPT(j)的值呢。实际是我们是可以的,也就是按照下图给出的伪代码。
伪代码:

强烈建议看下这个网站:https://farazdagi.com/2013/weighted-interval-scheduling/
除了详细的解释,还有python的代码实现,而且详细的解释了,具体每一步的复杂度。

参考资料:

1.http://www.tceic.com/3l9850lg1711ii7930h71614.html
2.https://www.daniweb.com/programming/software-development/threads/449426/weighted-interval-scheduling
3.https://en.wikipedia.org/wiki/Interval_scheduling
4.https://farazdagi.com/2013/weighted-interval-scheduling/

Weighted Interval Scheduling VS Interval Scheduling相关推荐

  1. PIFO到底是什么?【Programmable Packet Scheduling at Line Rate】

    Programmable Packet Scheduling at Line Rate 目录 Programmable Packet Scheduling at Line Rate ABSTRACT ...

  2. 057 Insert Interval 插入区间

    给出一个无重叠的按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 给定区间 [1,3],[6,9],插入并 ...

  3. INTERVAL数据类型-007学习笔记

    http://baggio785.itpub.net/post/31233/286119 INTERVAL数据类型用来存储两个时间戳之间的时间间隔. 可以指定years and months,或者da ...

  4. Apache Flink 漫谈系列(12) - Time Interval(Time-windowed) JOIN...

    说什么 JOIN 算子是数据处理的核心算子,前面我们在<Apache Flink 漫谈系列(09) - JOIN 算子>介绍了UnBounded的双流JOIN,在<Apache Fl ...

  5. [20170315]数据类型interval day to second

    [20170315]数据类型interval day to second.txt --上午监测dg应用情况时,查询如下视图: 1.前提: $ cat dg_status.sql column name ...

  6. Oracle INTERVAL DAY TO SECOND数据类型

    INTERVAL DAY TO SECOND数据类型 Oracle语法: INTERVAL '{ integer | integer time_expr | time_expr }' { { DAY ...

  7. Greenplum,HAWQ interval parser带来的问题 - TPCH 测试注意啦

    Greenplum,HAWQ interval parser带来的问题 - TPCH 测试注意啦 作者 digoal 日期 2016-10-11 标签 Greenplum , PostgreSQL , ...

  8. Insert Interval

    Insert Interval 题解 题目描述 即向有序.不重叠的区间序列中插入一个区间.如区间产生重叠,则合并.求插入新区间后的区间序列. 如:A = [1,3],[6,9],插入[2,6],插入后 ...

  9. 进击的 Kubernetes 调度系统(二):支持批任务的 Coscheduling/Gang scheduling

    作者 | 王庆璨(阿里云技术专家).张凯(阿里云高级技术专家) **导读:**阿里云容器服务团队结合多年 Kubernetes 产品与客户支持经验,对 Kube-scheduler 进行了大量优化和扩 ...

最新文章

  1. 【转】C# DateTime 日期计算
  2. Spring Boot @ConfigurationProperties注解的使用
  3. 【WebPack】WebPack的安装、使用WebPack打包 js/css/img 等文件
  4. Luogu1443 马的遍历【STL通俗BFS】
  5. 找出最大值和最小值(算法导论第三版9.1-2)
  6. 【我所認知的BIOS】—gt;ADU.exe
  7. 1 分钟抗住 10 亿请求!某些 App 是怎么做到的? | 原力计划
  8. 25个超有用的 AngularJS Web 开发工具
  9. 【刷题】BZOJ 1003 [ZJOI2006]物流运输
  10. 129个百度网盘资源搜索网站大全(建议收藏)
  11. 我的世界服务器显示fps,我的世界提升fps的方法 低配玩家必备秘籍
  12. Spring源码下载并导入Idea
  13. 最优化理论与凸优化的用处
  14. 凯恩斯归来,大堡礁畅游记
  15. Linux软件安装管理的三种方式——源码安装/deb/rpm/yum/apt
  16. 软件公司团队管理方法思考
  17. CMDS目的端数据库碎片整理记录
  18. Java中对象转换为字符串的几种方式
  19. [读书笔记]《小强升职记》
  20. 汽车行业V模型开发详解

热门文章

  1. unity官方社区,来一起学习
  2. ZYNQ Linux 移植:包含petalinux移植和手动移植debian9
  3. 移动云品牌焕新,全新LOGO全新启航!
  4. Linux rsync命令用法
  5. 机器学习之感知机算法
  6. Java技术——你真的了解String类的intern()方法吗,快点来学吧
  7. 一键清除苹果锁屏密码_苹果手机锁屏密码突然不正确了?不要慌!也先不要着急刷机!!!尝试一下以下方式!...
  8. DirectX9 10 11对比区别摘抄整理
  9. 2023电工杯数学建模AB题思路分析
  10. 如何对网站关键词进行合理布局?