Algorithm 什么';这种(非抢占式)调度算法的复杂性是多少?

Algorithm 什么';这种(非抢占式)调度算法的复杂性是多少?,algorithm,time-complexity,complexity-theory,scheduling,Algorithm,Time Complexity,Complexity Theory,Scheduling,我有一个关于作业(非抢占式)调度算法的算法复杂性的问题,特别是用于获得1 | |和(Uj)问题(仅一台机器)的最优解,其中Uj是一个单一惩罚(即:如果作业在截止日期前终止,等于0;如果作业延迟终止,等于1) 我需要最小化单一惩罚的总和(即:迟到工作的总和)。给出了作业处理时间及其截止日期,并且没有发布时间(因此,所有作业都是在时间t=0时同步发布的)。 算法的工作原理如下: 1-根据最早的到期日对所有作业排序 2-确定第一个迟到的工作Jj。如果没有迟到的作业,请转至步骤4 3-确定Jj与其前身之

我有一个关于作业(非抢占式)调度算法的算法复杂性的问题,特别是用于获得1 | |和(Uj)问题(仅一台机器)的最优解,其中Uj是一个单一惩罚(即:如果作业在截止日期前终止,等于0;如果作业延迟终止,等于1)

我需要最小化单一惩罚的总和(即:迟到工作的总和)。给出了作业处理时间及其截止日期,并且没有发布时间(因此,所有作业都是在时间t=0时同步发布的)。 算法的工作原理如下:

1-根据最早的到期日对所有作业排序

2-确定第一个迟到的工作Jj。如果没有迟到的作业,请转至步骤4

3-确定Jj与其前身之间的最大处理时间作业。删除该作业并返回步骤2,考虑没有删除作业的新序列

4-最佳顺序由以下公式给出:当前顺序[后跟]在步骤3中以任意顺序删除的作业子集

我被要求计算这个算法的最坏情况O(…)复杂度,在一个一般且良好实现的情况下(因此,考虑到所有算法步骤,我必须尝试猜测目前的复杂度“无实现”)

我认为第1步需要O(nlogn),因为(使用快速排序或合并排序)只是排序问题

那么,第2-3-4步呢?如果我们尝试在C/C++中实现这一点,那么最后的复杂度可能是O(n^2)是正确的吗?还是由于EDD“优化”了后续搜索,才是O(n*logn)?什么是确定其复杂性的可能证据


非常感谢。

在我看来,整个算法可以在
O(n logn)
时间内完成。其基本思想是分摊清除前辈的成本。每次删除前一个,我们将支付
O(log n)
,最多删除
n

具体情况如下。在步骤1之后,您只需要对作业进行一次遍历,因为从序列中删除作业只能使作业更快完成。每当你考虑序列中的一个工作时,你会重复删除它最大的前辈,直到它按时完成。请注意,“删除最大的前置项”操作的总数最多为
n
,因为每个作业最多删除一次。[注:我认为这里需要一些注意,因为“前置”应该是一个包容性的概念。也就是说,在考虑某个特定的作业j时,如果j大于任何以前的作业,那么您应该删除j并转到下一个作业。]

如何有效地实施“删除最大的前置程序”操作?您可以通过维护(从左到右遍历作业时)按作业大小对前置作业进行排序来实现这一点。例如,可以使用二进制搜索树来实现这种排序,它允许在
O(logn)
中插入和删除。每次你开始考虑一份工作时,你都会将它插入到树中,并支付
O(logn)
。删除最大的前置作业只是从树中删除最大的作业

前面我们注意到,最多会有
n
删除,对应于树中最多
n
删除。因此,我们为删除支付了
O(n logn)
的总成本。我们还为插入支付了
O(n log n)
的总成本(每个作业正好插入一次)。对所有数据进行排序的预处理步骤是
O(n logn)
,因此所有步骤的总成本是
O(n logn)

下面是一些伪代码:

J = input sorted by earliest due date
T = empty tree
for each j in J, from left to right:
  insert j into T
  while j does not finish on time:
    j' = delete largest from T
    if j' == j:
      break to next job in J
我唯一遗漏的细节是如何检查工作是否按时完成。但这非常简单,因为在树中插入和删除作业时,只需从计数器中进行加减,就可以跟踪“当前完成时间”