我有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
答案 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
希望有所帮助!