具有个人截止日期的任务调度算法

时间:2012-01-10 13:07:16

标签: java scheduling

我有n个任务,每个任务都有一个特定的截止日期和完成所需的时间。但是,我无法在截止日期前完成所有任务。我需要以这样的方式安排这些任务,以最大限度地减少任务在拍摄时间上的截止日期。考虑这种情况(左边的值是死线,右边的值是任务占用的时间):
2 2
1 1
4 3
这三项任务可以这样完美地完成:

时间1:任务2 - 任务1完成;任务2的0超调 时间2:任务1
时间3:任务1 - 任务2完成;任务1的超调1 时间4:任务3
时间5:任务3
时间6:任务3 - 任务3完成;任务3超过3

我需要一个更快的算法;我的目标是找到所有过冲的最大过冲(在上面的情况下是3)。现在,我正在根据截止日期对任务进行排序,但速度并不快,因为添加新任务时,我应该对整个列表进行排序。还有其他办法吗?


在Lawrey的建议之后,我正在使用PriorityQueue,但它没有给我准确的排序。 这是我的代码:

class Compare2DArray implements Comparator<int[]> {
public int compare(int a[], int b[]) {
    for (int i = 0; i < a.length && i < b.length; i++)
        if (a[i] != b[i])
            return a[i] - b[i];
    return a.length - b.length;
}
}

public class MyClass{
    public static void main(String args[]) {
        Scanner scan = new Scanner(System.in);
        int numberOfInputs= scan.nextInt();
        PriorityQueue<int[]> inputsList = new PriorityQueue<int[]>(numberOfInputs,new Compare2DArray());
        for (int i = 0; i < numberOfInputs; i++) {
            int[] input = new int[2];
            input[0] = scan.nextInt();
            input[1] = scan.nextInt();
            inputsList.add(input);

        }
    }

但这是对这个数组队列进行排序

2 2
1 1
4 3
10 1
2 1

 如

1 1
2 1
4 3
10 1
2 2

而不是

1 1
2 1
2 2
4 3
10 1

相同的比较器在List排序中工作正常。我没有得到PriorityQueue

的错误

3 个答案:

答案 0 :(得分:4)

使用堆实施优先级队列。因此,当您扫描优先级队列的元素时,它不能保证它将按排序顺序为您提供所有元素。这就是为什么你没有得到所需的排序数组。

我也面临同样的问题。我最终在c ++中使用multimap。但是时间复杂性仍然没有太大改善。

答案 1 :(得分:1)

除非你有很长的任务清单,例如数百万,不应该花这么长时间。

但是,你需要的可能是一个PriorityQueue,其中有O(1)add和O(ln N)

答案 2 :(得分:0)

我正在尝试同样的问题(我认为这来自于访谈街)。你收到这个订单了吗?

1 1,2 1 1,4 3,10 1,2 2

当你打印堆?您是否尝试逐个从堆中弹出物品并检查其订单? 我这样说是因为我的实现是在python中,当我打印堆时,我得到了你所说的相同顺序。但是,我认为这不是重点,因为当我逐个弹出堆的元素时,我会得到一个正确的顺序:

1 1,2 1,2 2,2 3,10 1

以下是我在python中的代码:(我使用heapq库来实现优先级队列) 要向堆中添加元素:

[deadline, minutes] = map( int, raw_input().split() )
heapq.heappush( heap, ( deadline, minutes ) )

要从堆中删除它们:

d, m = heapq.heappop( heap )

这是我打印堆时得到的输出,然后逐步从堆中弹出元素:

堆:[(1,1),(2,1),(4,3),(10,1),(2,2)] 工作:1 1 工作:2 1 工作:2 2 工作:4 3 工作:10 1

希望有所帮助!