以最少的插槽数调度作业/间隔

时间:2016-01-13 20:42:00

标签: algorithm

我认为这个问题类似于加权区间调度问题,但略有不同。

假设您有一个具有开始和结束时间的Shift s ,Shift具有 n 插槽,可以从 s.start 填充到 s.end 。槽是从s.start到s.end的可填充时间范围。您将获得 m 区间,其中每个区间都有一个开始和结束时间。将时间间隔分配给插槽,以便使用所需的最小插槽数。只要没有重叠间隔,就可以为插槽分配间隔。给定的间隔已知以适合给定的插槽数(但它们不必填充插槽)。将间隔 i 分配给插槽后,该插槽已填充 i 的时间范围。

我写了一个jsbin为此做了一个强力算法,但它是O(n!)或更糟,因为它检查每个可能的间隔序列并试图贪婪地将它们放入没有的第一个槽中冲突。

http://jsbin.com/bixalabume/1/edit?js,console(我将间隔称为“段”。)

这个问题是否可以在合理的时间内解决?我觉得有一个DP解决方案,但想不出一个。

我在这种编程方面并不是特别强大,但这里有一些类似的问题我看过但无法理解:

1 个答案:

答案 0 :(得分:2)

这可以通过图形着色来解决,其中对于每个创建顶点的区间,如果相应的区间重叠,则顶点与另一个顶点具有链接。这会自动使干涉图成为一个间隔图,它很容易着色,甚至不构建图形:按照开始时间对间隔进行排序,然后将它们逐个插入到它们可以进入的第一个槽中。这将是最佳的,因为为了在插入时需要新的颜色k,必须是在插入的间隔的开始时间占用k - 1颜色的情况,因此至少{{1那时间隔重叠,所以无论如何它们都不能被赋予少于k种颜色。