用于选择具有最高值之和的一组间隔的算法

时间:2016-11-28 16:34:51

标签: c++ algorithm time-complexity intervals

如何以尽可能有效的方式解决以下问题(可能是线性复杂性)?

作为输入,我有一些保持其值(整数)的间隔(开始,结束)。没有固定数量的间隔。 我想找到不重叠的区间组,它们的值之和尽可能高(因此区间数与结果值无关)。

我正在考虑将其实现为带有评估边缘的图形,并且可能使用Djikstra或类似的东西。但问题是插入图表,这需要花费太多时间。我怎样才能更好地(或者可能有效地实现图形)?

2 个答案:

答案 0 :(得分:2)

这个问题被称为加权区间调度。

这个想法是通过右端对间隔进行排序,然后使用动态编程来查找在特定间隔或之前结束的最重子集的权重。您可以使用二进制搜索来查找可以在当前有效间隔之前选取的最严格间隔。时间复杂度为O(N log N)

您可以在此处详细了解:https://courses.cs.washington.edu/courses/cse521/13wi/slides/06dp-sched.pdf

答案 1 :(得分:0)

首先按照开始时间间隔排序。然后,定义提供最大总和的函数f(i),考虑包括i和更高的所有区间。可以使用动态程序计算此功能。要指定f(i),您有两个选项:

  1. 包括i并继续下一个不与i重叠的间隔,因此:
    i.value + f(nextNonOverlappingInterval)
  2. 请勿包含i并继续下一个时间间隔:
    f(nextInterval)
  3. 总的来说,你的功能是:

    f(i) = max(i.value + f(nextNonOverlappingInterval), f(nextInterval))
    

    设置一个动态程序,从最后一个间隔开始计算f并传播到第一个间隔,然后有解决方案。

    也可以使用此问题的替代公式从前到后计算或使用记忆来解决它。