简单的最大利润调度算法

时间:2015-07-29 19:20:13

标签: algorithm time-complexity scheduling

假设你有一个持续时间为L [5,8,2]的数组,截止日期为D [13,8,7]。如果你有每个活动E [i]的结束时间。您收到(或丢失)每项活动的金额D [i] - E [i],其总和为已获得或丢失的总金额,本例中为4. E取决于您每个活动的顺序活动。例如,如果按升序执行每个L [i],则得到的E将为[7,15,2]。

我发现在运行O(nlog n)的L数组排序后会出现最大值。令人着迷的是,在对L数组进行排序之后,没有必要对D数组进行排序,而对于任何截止日期的安排,你最终会得到相同的最大值(我已经试过更大的集合)。有没有更好的方法来解决这个问题,让运行时间小于O(nlogn)?我花了几个小时尝试对长度和截止日期进行各种线性调整,无济于事,甚至使用条件语句。在我看来,这可以在O(n)时间内完成,但我不能为我的生活找到它。

2 个答案:

答案 0 :(得分:1)

您对无限数组的整数进行排序。除了基于仅比较它们的大小之外,有更快的方式对整数进行排序:确定性情况的O(n log log n)和随机算法的O(n sqrt(log log n))。有关详细讨论,请参阅https://cstheory.stackexchange.com/a/19089

如果整数有界(例如,你可以保证它们不会超过某个值),counting sort将解决O(n)中的问题。

答案 1 :(得分:0)

对持续时间进行排序是正确的答案。正如@liori所指出的,有不同的方法可以对整数进行排序,但无论如何,您仍然需要对持续时间进行排序。

让我们看看问题的抽象。从L[a,b,c]D[x,y,z]开始。假设任务按给定的顺序执行,则结束时间为E[a,a+b,a+b+c],因此

profit = (x - a) + (y - (a+b)) + (z - (a+b+c))

相同
profit = x + y + z - 3a - 2b - c

由此可以看出,截止日期的顺序并不重要,但执行任务的顺序非常重要。从利润中多次减去第一个任务的持续时间。但是最后一项任务的持续时间只从利润中扣除一次。很明显,任务需要按照从最短到最长的顺序完成。