最短作业优先算法是通过最小堆数据结构实现的。 那么SJF算法的时间复杂度是多少?
我在某处读过它是n * 2 * log n,它等于n log n。请解释一下。 (对不起,如果这个问题太容易了。我是新手。)
提前致谢。
答案 0 :(得分:1)
Insert和Extract-Min操作的运行时间均为O(log n)
。有n
个任务,每个任务都必须插入堆中,然后从堆中提取,导致运行时间为O(n log n)
。
Insert
的运行时间为O(log n)
的原因是,在插入时我们首先将新任务添加到堆最终位置。这不一定保持heap property,因为新任务的开头可能比其父级的优先级更好(拥有更小的密钥)。这就是Insert
操作涉及Heapify-Up procedure的原因,其目的是恢复堆顺序。 Heapify-Up
程序的运行时间为O(log n)
。
Extract-Min
的运行时间为O(log n)
的原因是在Extract-Min
操作中我们首先删除堆的根(第一个任务),然后将最后一个任务移到第一个位置(即用驻留在最后位置的任务替换root)。由于这可能违反了堆属性,Extract-Min
涉及执行Heapify-Down procedure。 Heapify-Down
程序的运行时间也为O(log n)
。
答案 1 :(得分:0)
可以使用段树以O(nlogn)时间复杂度完成非抢先sjf。 接受struct中进程的输入,并根据struct数组进行排序 到达时间。现在,我们将使用段树查找范围的最小突发时间和相应的进程ID,这将需要 2 * logn 进行查询并同时更新两者。