【发布时间】:2023-04-01 07:20:01
【问题描述】:
最短作业优先算法是通过最小堆数据结构实现的。 那么SJF算法的时间复杂度是多少呢?
我在某处读到它是 n*2*log n ,它等于 n log n 。请解释如何。 (对不起,如果问题太简单了。我是新手。)
提前致谢。
【问题讨论】:
标签: algorithm operating-system
最短作业优先算法是通过最小堆数据结构实现的。 那么SJF算法的时间复杂度是多少呢?
我在某处读到它是 n*2*log n ,它等于 n log n 。请解释如何。 (对不起,如果问题太简单了。我是新手。)
提前致谢。
【问题讨论】:
标签: algorithm operating-system
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操作中我们先删除了堆的根(第一个任务),然后将最后一个任务移动到第一个位置(即,用位于最后位置的任务替换根)。由于这可能违反堆属性,Extract-Min 涉及到Heapify-Down procedure 的执行。 Heapify-Down 过程的运行时间也为O(log n)。
【讨论】:
非抢占式 sjf 可以使用分段树在 O(nlogn) 时间复杂度内完成。 取 struct 中进程的输入,并根据 struct 数组对 struct 数组进行排序 到达时间。现在,我们将使用分段树来查找范围最小突发时间和相应的进程 id,这将需要 2*logn 进行查询和更新。
【讨论】: