在这个Job Sequencing Problem中,我们如何证明贪婪方法提供的解决方案是最优的?
此外,我也无法找出作者后来声称的O(n)解决方案
通过使用union-find数据结构可以将其优化为几乎O(n)。
答案 0 :(得分:2)
贪婪解决方案的最优性可以通过交换论证看出如下。不失一般性,假设所有利润都不同,并且工作按利润递减顺序排序。
修复解决方案S
。从这个解决方案中,删除每个错过最后期限的工作。
通过此转换,每个作业在截止日期之前完成,所得到的解决方案S1
仍然是最佳的。对于作业i
,请考虑间隔I_i:=[0,min(n,deadline(i))]
(如贪婪算法中所示)。在此区间中,在作业i
的右侧,只有处理时间较长的作业(如果没有,它们要么在我们的订单之前被考虑过,要么可以在违反最后期限的情况下进行交换)。将作业i
放在I_i
中可能的最右侧位置。
总的来说,我们有以下声明。
每个解决方案S
都可以转换为具有以下特性的解决方案S'
。
S'
包含S
在截止日期前完成的所有工作。i
中的每个作业S
,i
I_i
之后的所有作业都有更长的处理时间。i
中的每个作业S
,i
中的I_i
之后没有空闲时间。S'
与S
具有相同的目标价值。特别是,存在具有上述属性的最佳解S*
。设S
为贪婪算法生成的算法。请注意,S
还具有上面的属性2和3。让i
成为S
中的第一个作业,而不是S*
中的作业。让pos
成为i
中S
的时段。如果pos
中S*
为空,则可以通过添加S*
来改进i
,这与S*
的最优性相矛盾。如果pos
中的S*
不为空,则i'
中pos
处的作业S*
的利润不会超过i
1}},否则贪婪算法会选择i'
为pos
S
。因此,它的利润必须低于i
。这意味着可以将其删除并替换为i
中的S*
,这也与S*
的最优性相矛盾。
答案 1 :(得分:1)
正确性证明。让我们假设它不正确。这是什么意思?这意味着在某个步骤我们已经抛弃了一份工作,因为如果不删除已经取得的工作就无法添加它。如果我们删除了已经占用的一个并将当前的一个放入其时间段,我们就不会为下一个作业改变任何东西(占用时隙的集合将是相同的)。但总利润会减少。因此,该算法产生的解决方案是最优的。
比O(n ^ 2)
更快。要做到这一点,我们需要从给定的一个快速找到最左边的自由位置。如果我们使用union-find结构来维护一组占用位置,我们可以找到当前作业的截止日期所在的组以及位于其左侧的take元素。但由于排序,它仍然是O(n log n)
。
答案 2 :(得分:0)
考虑一个价值2分的截止日期4和3个职位,每个职位1分,截止日期为3.这个反驳"贪婪"算法:在更昂贵的工作之前,先做三个更便宜的工作更有利可图。
至于O(n ^ 2)与O(n),我认为这两种说法都是错误的。 "贪心"如上所述,算法包括对作业进行排序 - O(nlogn) - 加上对排序列表的单次扫描,填充解决方案序列时隙 - O(n) - 并因此为O(nlogn)。
为了使其成为线性,人们必须做一些关于排序的事情,例如使用基数排序,这可以被认为是线性的,用于实际目的。
答案 3 :(得分:0)
给定的证明不完整。即,句子“我在S *中的职位不能获得比我更大的利润”的说法尚未得到证实,我认为不可能。无论如何,即使工作i的利润大于或等于i”,也可以证明该语句成立。