【问题标题】:time complexity of shortest job first algorithm when jobs are non preemptive作业非抢占时最短作业​​优先算法的时间复杂度
【发布时间】:2023-04-01 07:20:01
【问题描述】:

最短作业优先算法是通过最小堆数据结构实现的。 那么SJF算法的时间复杂度是多少呢?

我在某处读到它是 n*2*log n ,它等于 n log n 。请解释如何。 (对不起,如果问题太简单了。我是新手。)

提前致谢。

【问题讨论】:

    标签: algorithm operating-system


    【解决方案1】:

    InsertExtract-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)

    【讨论】:

    • 插入要求您在堆的末尾添加新项目并将其向上移动。删除将根替换为最后一项并将其移到堆中。这两个操作都不需要您链接到的完整 heapify 过程。
    • @JimMischel,感谢您的评论。我已经相应地编辑了我的答案。
    【解决方案2】:

    非抢占式 sjf 可以使用分段树在 O(nlogn) 时间复杂度内完成。 取 struct 中进程的输入,并根据 struct 数组对 struct 数组进行排序 到达时间。现在,我们将使用分段树来查找范围最小突发时间和相应的进程 id,这将需要 2*logn 进行查询和更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 2017-04-18
      • 2019-09-03
      • 1970-01-01
      • 2012-04-24
      相关资源
      最近更新 更多