【问题标题】:Interval Scheduling (not typical): Maximize total length for all scheduled intervals [duplicate]间隔调度(非典型):最大化所有调度间隔的总长度[重复]
【发布时间】:2016-04-18 09:02:07
【问题描述】:

给定间隔,例如(1,3) (2,4) (3,6) (4,7),找到不存在冲突的时间表,并且安排的时间间隔总长度最大。

当他们在学校谈论贪婪解决方案和动态规划等主题时,我研究过“间隔调度”类型的问题。我知道解决方案会因调度的具体目标而异,例如:安排尽可能多的间隔尽可能 ==> 贪婪。

但是对于这个问题,我认为我们将不得不诉诸蛮力(枚举)? 请指教

【问题讨论】:

标签: algorithm sorting backtracking


【解决方案1】:

您提出的问题仍然可以用贪婪的方法解决。既然您已经知道原始的间隔调度问题,我将根据您在问题陈述中提到的内容制定解决方案。

第 1 步:根据开始时间对区间进行排序。

第 2 步:维护一个“生成”池,该池使用 2 元组堆来维护数据结构。

在第 2 步中更准确地说,假设我们有 N 个排序区间 I[0] ... I[N-1],每个 I 都有一个 start 和一个 stop 属性,所以 I[i].start <= I[i+1].start。你有一个 2 元组堆,每个元组代表 (T, M)。 T 表示离开堆的时间,或者等效地,间隔的停止时间;如果选择此间隔,M 表示最大电流覆盖范围。注意堆的顺序是由T维护的。一个变量ANS被维护了,它保持了当前的最大覆盖率。因此,算法运行如下:

ANS <- 0
HEAP <- [empty]
for each sorted intervals `I[i]`:
    while HEAP.empty() == false && HEAP.first_element.T < I[i].start
        TMP = HEAP.first_element
        HEAP.pop_first_element
        if TMP.M > ANS
            ANS = TMP.M
    HEAP.insert((I[i].stop, ANS + I[i].stop - I[i].start))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2018-02-18
    • 2013-12-10
    相关资源
    最近更新 更多