Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有个体截止时间的任务调度算法_Java_Scheduling - Fatal编程技术网

Java 具有个体截止时间的任务调度算法

Java 具有个体截止时间的任务调度算法,java,scheduling,Java,Scheduling,我有n个任务,每个任务都有一个特定的截止日期和完成所需的时间。但是,我无法在截止日期内完成所有任务。我需要以这样一种方式安排这些任务,以尽量减少任务在拍摄时间内的截止日期。考虑这个用例值是死线,右边值是任务所需要的时间: 2 2 1 1 4 3 这三项任务可以这样最佳地完成: 时间1:任务2-任务1完成;task2的0超调量 时间2:任务1 时间3:任务1-任务2完成;task1的1超调量 时间4:任务3 时间5:任务3 时间6:任务3-任务3完成;task3的3超调量 我需要一个更快的算

我有n个任务,每个任务都有一个特定的截止日期和完成所需的时间。但是,我无法在截止日期内完成所有任务。我需要以这样一种方式安排这些任务,以尽量减少任务在拍摄时间内的截止日期。考虑这个用例值是死线,右边值是任务所需要的时间: 2 2 1 1 4 3 这三项任务可以这样最佳地完成:

时间1:任务2-任务1完成;task2的0超调量 时间2:任务1 时间3:任务1-任务2完成;task1的1超调量 时间4:任务3 时间5:任务3 时间6:任务3-任务3完成;task3的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
相同的比较器在列表排序上工作良好。我不知道PriorityQueue有什么问题,除非你有一个很长的任务列表,比如数百万个,它不应该花那么长的时间


然而,您需要的可能是一个优先队列,它有O1 add和Oln take

我想我是在试图回答来自interviewstreet的相同问题。您收到订单了吗:

11,21,43,101,22

你什么时候打印的?你有没有试着一个接一个地从堆中取出物品并检查它们的顺序? 我这样说是因为我的实现是用python实现的,当我打印堆时,我得到的顺序与您所说的相同。但我想这不是重点,因为当我一个接一个地弹出堆中的元素时,我得到了一个正确的顺序,即:

11,21,22,43,101

以下是我在python中的代码:我使用heapq库实现优先级队列 要将元素添加到堆中,请执行以下操作:

[deadline, minutes] = map( int, raw_input().split() )
heapq.heappush( heap, ( deadline, minutes ) )
d, m = heapq.heappop( heap )
要从堆中删除它们,请执行以下操作:

[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 就业人数:21 就业人数:2 就业人数:43 就业人数:101

希望有帮助

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


我也面临同样的问题。最后我在C++中使用了MultIMAP。但时间复杂度仍然没有太大提高。

我可能有多达100000个任务。对于添加的每个任务,我需要计算最佳超调量。所以在100000个案例中,我应该排序100000次!然后它会有所不同,试试PriorityQueue,它会快得多。我希望找到一个更好的算法。我的方法正确吗?根据截止日期排序然后计算超调量?我想是的。PriorityQueue将在Oln时间内为您提供下一个条目。如何创建PriorityQueue的副本?我没有PriorityQueue的get方法,就像在列表中一样。我实际上是在调试程序时查看对象,而不是打印出来。但当我打印出这些值时,它们都被分类了。你真的用这种方法在interviewstreet上解决了这个问题吗?由于他们需要输入的每个前缀的答案,即第一个作业的最大超调量、第一个和第二个作业的最大超调量、前三个作业的最大超调量等,因此单独求解每个前缀将至少在^2上,并且在^2日志n上有一个heapq。我不得不做一些更复杂的事情来在这些前缀之间共享信息,并将复杂性降低到日志上n@SumuduFernando你是怎么做到的?我已经挣扎了一段时间,我怀疑我能否在评论的空间里解释它;关键的想法是,无论你在做什么样的任务,最理想的情况是,你都会先做那些截止日期更近的任务,先尝试证明这一点。然后,为了将前k个任务的解决方案扩展到包括任务k+1,我需要一些方法来跟踪比任务k+1更紧急的任务的信息。我使用了类似于二叉索引树的东西来高效地存储这些信息,但我找不到任何关于我为此学习的版本的参考资料。像泥一样清澈?@SumuduFernando谢谢你的提示!是的,我已经证明了为什么最早的截止日期是最优的。为了下一个即将到来的任务,我一直在努力扩展它。我将尝试解决如何使用二进制索引树进行此操作。以下是与适当解决方案完全相同的问题: